【问题标题】:C# DllImport call throws an exception on one computer, but works on anotherC# DllImport 调用在一台计算机上引发异常,但在另一台计算机上有效
【发布时间】:2017-02-05 23:02:56
【问题描述】:

在运行以下引用非托管 DLL(用 C 编写)的 C# 应用程序时,我得到一个带有以下信息的 DllNotFound 异常:

附加信息:无法加载 DLL 'C:\Windows\System32\myLib.dll':找不到指定的过程。 (HRESULT 异常:0x8007007F)

我的尝试:

  • 我已验证 DLL 存在于预期路径中(事实上,当 DLL 不存在时,我会收到不同的错误消息)
  • 我已将 exe 和随附的 dll 复制到另一台计算机(在同一路径中),它可以正常运行。
  • 按照此处某些其他答案的建议,我已将 DLL 复制到 System32 目录(并在那里引用它)。
  • 我仔细检查了访问权限,并禁用了 MS Security Essentials。
  • 我已确保平台目标匹配。

这令人费解,因为加载 DLL 所需的依赖项似乎很少。

【问题讨论】:

  • 两台电脑的操作系统是什么?
  • DLL 对其他 DLL(可能是运行时库)的依赖关系如何?
  • 这是一个基本的 DLL Hell 问题。它找到了您要使用的 DLL 并毫无问题地加载它,但它没有您要调用的函数。部署您在开发机器上使用的完全相同文件。假设你在你的开发机器上正确地测试了它,永远不要跳过它。使用 DLL 上的 Dumpbin.exe /exports 进行另一种验证方式。
  • @HansPassant ,如果我有代表,我会支持你的评论。部署完全相同的依赖 DLL 帮助我找到了解决方案。

标签: c# c dll dllimport


【解决方案1】:

不要将您的 DLL 复制到系统文件夹中。那属于系统,你不应该修改它。从它们所在的任何系统文件夹中删除这些 DLL。

而是将您的 DLL 放在与可执行文件相同的目录中。之后,需要的另一个步骤是确保任何依赖项(通常是 VC 运行时)可用。根据您想要部署的确切方式,这可能涉及在任何目标机器上安装 VC 可再发行包。

【讨论】:

  • 此解决方案有助于消除“只需将其复制到 system32”的神话;它只是没有解决我的具体问题。
【解决方案2】:

旧版本的依赖项(在本例中为 Jungo DLL),它没有导出与新版本相同的函数集,已安装到出现错误的机器上。复制较新的版本解决了这个问题。

因此,虽然两台机器上都存在相关文件,但所需的导出函数集却没有。 C# 在 DLL A 上指定了“找不到过程”错误,从技术上讲,它是在依赖项的依赖项上。

Dependency walker 被证明在识别依赖项是什么并指出其中一个缺少导入方面很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多