.NET有时无法加载DLL

时间:2013-10-04 16:53:14

标签: c# .net

我正在使用Microsoft Visual Studio Express 2012 for Windows Desktop(管理员)

我有一个项目库FOO.DLL,其中“复制到输出目录”点击“始终复制”。

大多数情况下,这个DLL加载正确并且每个人都很高兴。

有时,我会收到System.DllNotFoundException消息:

Additional information: Unable to load DLL 'FOO.DLL': 
Invalid access to memory location. (Exception from HRESULT: 0x800703E6)

Debug和Release中都会发生此错误。它发生在“干净”之后,只是在第二次或第八次运行相同的构建之后。

这是DLL,.NET运行时或我的.NET代码中的错误吗?

2 个答案:

答案 0 :(得分:4)

  

对内存位置的无效访问。 (HRESULT异常:0x800703E6)

当该DLL内的代码因AccessViolation失败时,将返回此错误代码。特殊代码,在DLL加载期间的非常关键的时间运行。坏代码位于DLL的DllMain()入口点。吞下这个异常,是保持Windows加载器稳定所必需的,你看到的就是它产生的错误代码。

这是一个非常严重的事故,你需要与DLL的作者一起解决这个问题。您可以调试异常,使用Debug + Exceptions,勾选Win32 Exceptions的Thrown复选框。确保关闭“我的代码”调试,“工具+选项”,“调试”,“常规”。启用非托管调试,Project + Properties,Debug选项卡。抛出异常时调试器停止。如果您没有DLL的源代码,则无需查看,也无法解决问题,这需要作者的帮助。他希望Stack Trace窗口的内容能够解决问题。

答案 1 :(得分:0)

Visual Studio不擅长跟踪从一个项目到下一个项目的这些依赖项。如果您的项目(包括FOO.DLL)稍后包含在另一个项目中,我怀疑Visual Studio不会总是将这个额外的文件正确地传递到顶级项目。

我必须创建一个小的MSBuild任务来清理项目的内容,以便正确地转移这些文件(并在干净时删除)。也就是说,我们的项目布局对YMMV事物的非正统复杂方面有点了解。

长话短说这将是我调查的第一个地方,并确保文件遵循,最短(但不是最干净)意味着将FOO.DLL再次添加到需要包含原始项目的项目中。在小型结构上运行良好,对于较大的项目结构,我会研究MSBuild Task或者包装部署解决方案(la Nuget)。

希望这有帮助