.NET有时无法加载DLL文件。

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)

这个错误在Debug和Release模式下都会发生。它会在"clean"之后以及仅仅是第二次或第八次运行相同的构建之后出现。

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


我不能确定这一点,因此这只是一个评论。但这听起来像是你的应用程序部署后会解决的问题。这更像是构建过程中的问题。 - Gray
foo.dll是托管的还是非托管的?另请参见http://stackoverflow.com/questions/5375675/native-loading-works-good-loading-from-net-gives-error-unable-to-load-dll-my?rq=1 - Anton Tykhyy
@Gray 这个项目没有“部署过程”。它只是几千行代码,生成一个EXE文件和前面提到的DLL文件。 - Cuadue
@AntonTykhyy 这是一个未经管理的DLL。有时它可以正常工作,有时它也不行。即使它能够工作,我从来没有看到过任何DEP对话框。 - Cuadue
@Cuadue 我的意思是一旦项目在 Visual Studio 之外分发/独立运行,我认为就没问题了。 - Gray
2个回答

4
无效的内存位置访问。(HRESULT:0x800703E6)这个错误代码是由于DLL内部的代码发生了"AccessViolation(访问违规)"异常而返回的。这种异常在DLL加载过程中运行的非常关键的代码中被阻断,以保证Windows loader稳定性,而你所看到的只是它产生的错误代码。这是一个非常严重的问题,需要与DLL作者合作解决。您可以调试异常,使用"调试+异常",勾选Win32异常的抛出复选框。确保关闭"Just My Code"调试,打开工具+选项+调试+常规。启用非托管调试,进入项目+属性+调试选项卡。当抛出异常时,调试器会停止执行。如果您没有DLL的源代码,则无法查看也无法修复该问题,这需要向作者寻求帮助。他将需要Stack Trace窗口的内容来尝试修复问题。

1
问题的解释非常出色。然而,我在不同的项目中遇到了与OP相同的问题,并且这个问题通常会在同一个DLL上随机出现,有时能构建成功,但5分钟后又无法构建。对此有什么想法吗? - Nikola Sivkov

0

Visual Studio在跟踪项目之间的依赖关系方面并不是很好。如果您的项目(包括FOO.DLL)稍后被包含在另一个项目中,我怀疑Visual Studio不会始终正确地将此额外文件传递到顶级项目。

我不得不创建一个小的MSBuild任务来清理项目内容,以便这些文件可以正确传递(并在清理时删除)。话虽如此,我们的项目布局有点不规范和复杂,因此可能因人而异。

长话短说,这将是我首先要查看并确保文件跟随的地方。最简单(尽管不是最干净的)方法是将FOO.DLL再次添加到需要它的原始项目所包含的项目中。对于较大的项目结构,我会考虑MSBuild任务或者类似Nuget的打包部署解决方案。

希望这可以帮助到您。


好的,这个解决方案中只有一个项目。我看不出再次添加文件会有任何作用,因为它只是一个XML文件中的条目,而且在我的看来它看起来很干净。我已经尝试了从版本控制中进行全新的检出(没有obj、bin文件夹、suo、用户文件),但结果相同。 - Cuadue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接