【发布时间】:2012-07-15 09:36:07
【问题描述】:
我在 .Net 4.0 和 VS2010 中使用 C#,并且使用了一些非托管的第 3 方 DLL(来自同一供应商)。 DLL 处理文件中的字节数组,执行它们的逻辑,并返回一些新的东西。这适用于大约 80% 的文件,但其余文件会使应用程序崩溃。这可以用相同的文件重现。例外是:
System.AccessViolationException 尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
它在这一行崩溃:
oPages = _penReq.Pages;
旧版本的软件(大约 2008 年左右)调用相同的 DLL 并处理相同的文件时不会发生这种情况。我已将此添加到配置文件中:
<legacyNullReferenceExceptionPolicy enabled = "1"/>
添加后,程序不会崩溃(问题行周围有一个 try-catch),但当然 oPages 为空。
我意识到这是一个第 3 方非托管 DLL,因此我只能在不联系该供应商的情况下获得这么多帮助(这非常困难),但考虑到相同的代码和 DLL 可以与我们的旧版本软件一起使用,是有解释或可能的解决方案吗?
为了让这更有趣一点,在我们的 Server 2003 32 位机器上崩溃的文件中约有 25% 在我的 Win7 64 位机器上成功处理。
谢谢。
更新
下面是更好看的代码:
byte[] inkBytes = Data; //produces an array of Bytes
Vendor.Service.PenRequest _penReq = new Vendor.Service.PenRequest();
_penReq.Initialize(Data);
_penId = _penReq.PenId; //returns a string with an ID. Confirmed working.
Vendor.Service.RequestPages oPages = _penReq.Pages; //returns list of pages. Not working
【问题讨论】:
-
他们是提供托管包装器,还是您自己 PInvoking 它?
-
是您编写的
oPages = _penReq.Pages代码来访问 DLL 的输出吗?它是 DLL 本身的代码吗? -
我在虚拟化环境中工作时经常遇到这种情况,您是否使用任何虚拟主机来运行这些机器?
-
我不得不承认我不知道这意味着什么。我只是将 DLL 称为“private dllvar foo;”。我最初只是从 Windows 服务调用它,但由于我收到此错误,我一直将它们包装在一个单独的 .exe 控制台应用程序中并从那里调用它进行测试。我将字节数组作为参数传递。
-
Jonathan _penReq 和 oPages 都是我在代码中调用的来自 DLL 的变量。 Trikks 我正在使用并行从我的 Bootcamp 分区运行它,但它发生在刚启动我的 Windows 分区和使用 Server 2003 机器时。
标签: c# .net dll nullreferenceexception