【问题标题】:3rd party DLL crashes with System.AccessViolationException (Protected Memory)第 3 方 DLL 因 System.AccessViolationException(受保护的内存)而崩溃
【发布时间】: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


【解决方案1】:

Dot Net 2.0 比 1.1 有一个新的安全功能,要求您完全信任非托管文件和资源,然后才能使用它们。确保 dll 及其使用的任何资源都必须具有完全访问权限并且它们是完全受信任的。

【讨论】:

  • 应用程序完全信任,但它仍然在特定文件上崩溃。
  • 不是应用程序本身。我的意思是第 3 方 dll 试图访问的任何资源。
  • 我使用 gacutil.exe 将它们添加到 GAC 中,这不是让它们完全信任吗?
  • 在您的应用程序中,将第 3 方 dll 以及您正在使用的任何资源设置为 Copy Local = true
猜你喜欢
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多