3

我正在使用 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)

此错误发生在调试和发布中。它发生在“清理”之后,并且在第二次或第八次运行相同的构建之后。

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

4

2 回答 2

4

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

当该 DLL 中的代码因 AccessViolation 失败时,将返回此错误代码。特殊代码,在 DLL 加载过程中非常关键的时候运行。错误代码位于 DLL 的 DllMain() 入口点中。该异常被吞下,这是保持 Windows 加载程序稳定所必需的,您所看到的只是它产生的错误代码。

这是一个非常严重的事故,您需要与 DLL 的作者合作才能解决此问题。您可以调试异常,使用 Debug + Exceptions,勾选 Win32 Exceptions 的 Throw 复选框。确保关闭仅我的代码调试,工具+选项,调试,常规。启用非托管调试,项目 + 属性,调试选项卡。抛出异常时调试器停止。如果您没有 DLL 的源代码,那么几乎没有什么可看的,也无法解决问题,这需要作者的帮助。他希望堆栈跟踪窗口的内容能够解决问题。

于 2013-10-04T18:29:09.133 回答
0

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

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

长话短说,这将是我首先查看并确保文件遵循的地方,最短的(尽管不是最干净的)意味着将 FOO.DLL 再次添加到包含需要它的原始项目的项目中。在小型结构上效果很好,对于较大的项目结构,我会研究 MSBuild Task 或打包部署解决方案(a la Nuget)。

希望这可以帮助

于 2013-10-04T17:05:29.950 回答