AccessViolationException,试图读取或写入受保护的内存

时间:2010-04-01 19:20:36

标签: c# .net pinvoke unsafe access-violation

我正在使用包含非托管代码的dll来与特定硬件进行交互,我正在尝试从C#中使用它,但我一直在获取AccessViolationException。

是什么造成的,我该如何解决?

namespace FingerPrint {
    public unsafe partial class Form1 : Form {

        [DllImport("MyDll.dll")]
        public static extern int DoesExist();

        public unsafe Form1() {
            InitializeComponent();

            MessageBox.Show(DoesExist() + "");
        }
    }
}

1 个答案:

答案 0 :(得分:1)

大约95%的非托管代码的所有故障模式都会产生访问冲突。您可以通过使[DllImport]声明错误来触发此类故障模式。但是发布的DoesExist()不能触发一个。

请与供应商或DLL的作者联系以获取支持。他们在重现故障并使用调试器及其源代码进行诊断时应该没有什么问题,如果你让它很容易失败的话。

为了完整性,AccessViolation的最典型原因是:

  • 非托管代码中的内存管理错误,导致堆损坏
  • 未验证数据,导致空取消引用或缓冲区溢出
  • 在调用支持函数时未检查失败返回错误代码