常见原因 - .NET下的访问冲突错误

时间:2009-02-08 23:27:50

标签: .net vb.net access-violation

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

到目前为止我检查过的事情 -

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

还有其他建议吗?

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

2 个答案:

答案 0 :(得分:3)

使用不安全或非托管代码可以获得这种类型的异常。

AccessViolationException:

  

发生访问冲突   代码时的非托管或不安全代码   尝试读取或写入内存   没有分配的,或者   它没有访问权限。这个   通常是因为指针有一个   坏的价值。并非所有读取或写入   通过坏指针导致访问   违规,所以访问违规   通常表示有几个读数   或者写错了   指针,那个记忆可能是   损坏。因此,访问违规   几乎总是表明严重   编程错误。在.NET中   框架版本2.0,一个   AccessViolationException清楚   识别这些严重的错误。

     

完全由...组成的程序   所有可验证的托管代码   引用有效或为null,   和访问违规是不可能的。   发生AccessViolationException   仅在可验证的托管代码时   与非托管代码或与之交互   不安全的托管代码。

推荐:

GFlagsApplication Verifier

答案 1 :(得分:1)

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