【问题标题】:.NET sometimes cannot load a DLL.NET 有时无法加载 DLL
【发布时间】:2013-10-05 03:50:32
【问题描述】:

我正在使用 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 代码中的错误吗?

【问题讨论】:

  • 我不能肯定地说,因此它只是一个评论。但这听起来像是在部署您的应用程序后就会解决的问题。它感觉更像是构建过程的问题。
  • foo.dll 是托管的还是非托管的?另见stackoverflow.com/questions/5375675/…
  • @Gray 此项目没有“部署过程”。生成一个 EXE 和前面提到的 DLL 的代码只有几千行。
  • @AntonTykhyy 这是一个非托管 DLL。有时有效,有时无效。我从来没有看到任何 DEP 对话框,即使它确实有效。
  • @Cuadue 我的意思是,一旦项目在 Visual Studio 之外分发/独立运行/运行,我认为就可以了。

标签: c# .net


【解决方案1】:

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

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

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

【讨论】:

  • 很好地解释了这个问题。但是,我在不同的项目中遇到了与 OP 相同的问题,这随机出现在(通常)同一个 DLL 上,一个构建它可以工作,5 分钟后它不会。有什么想法吗?
【解决方案2】:

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

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

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

希望对你有帮助

【讨论】:

  • 嗯,这个解决方案中只有一个项目。我看不出再次添加文件会有什么作用,因为它只是 XML 文件中的一个条目,对我来说看起来很干净。我已经尝试从版本控制(没有 obj、bin 文件夹、suo、用户文件)中重新签出,结果相同。
猜你喜欢
  • 2012-04-12
  • 2016-09-17
  • 2017-04-29
  • 2019-08-21
  • 2023-01-20
  • 2022-11-22
  • 1970-01-01
  • 2017-06-26
  • 2012-01-30
相关资源
最近更新 更多