我正在使用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代码中的错误吗?
答案 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)。
希望这有帮助