8

我正在寻找 .NET 下访问冲突错误的常见原因。

到目前为止我检查过的东西 -

  • 对所有实现 IDisposable 的对象调用 Dispose
  • 检查对 COM 对象的调用中的有效参数
  • 显式删除所有手动添加的事件处理程序
  • 不要明确调用 GC.Collect/GC.WaitForPendingFinalizers
  • 处理本机对象(位图等)时添加和删除内存压力(已添加
  • 验证有效参数类型的所有 PInvoke 调用
  • 确保正确使用 IntPtr、SafeHandle 和 HandleRef
  • 线程(线程安全,可重入函数),正确使用等待句柄。(已添加
  • 确保应用程序和 DLL 都针对相同的平台(x86 或 x64)(应用程序和 dll 的目标应与 COM 对象相同。)(已添加

还有其他建议吗?

编辑- 将故障转储分析移至不同的问题。

4

2 回答 2

3

任何不安全或非托管代码的使用都可能使您遇到这种类型的异常。

访问违规异常:

当代码尝试读取或写入尚未分配或无权访问的内存时,在非托管或不安全代码中会发生访问冲突。这通常是因为指针的值不正确。并非所有通过错误指针进行的读取或写入都会导致访问冲突,因此访问冲突通常表示通过错误指针发生了多次读取或写入,并且内存可能已损坏。因此,访问违规几乎总是表明严重的编程错误。在 .NET Framework 2.0 版中,AccessViolationException 清楚地标识了这些严重错误。

在完全由可验证的托管代码组成的程序中,所有引用要么有效要么为空,并且访问冲突是不可能的。仅当可验证的托管代码与非托管代码或不安全的托管代码交互时,才会发生 AccessViolationException。

推荐的:

GFlags应用程序验证器

于 2009-02-08T23:48:56.683 回答
1

您是在运行时生成 IL 还是使用这样做的组件?使用不安全的 C# 代码,进行指针操作?

于 2009-02-08T23:30:17.510 回答