【问题标题】:DllNotFoundException for .dll which is in current folder当前文件夹中 .dll 的 DllNotFoundException
【发布时间】:2011-11-15 15:31:50
【问题描述】:

每当我的应用程序尝试使用 DLL 中存在的函数时,我都会收到与可执行文件位于同一文件夹中的 .dll 的 System.DllNotFoundException。奇怪的是它只发生在一个用户的 PC 上。它在我的开发 PC 上运行良好,并且在我尝试过的一台非开发 PC 上运行良好。此外,文件夹中还有其他 DLL, 被发现并正确使用。有问题的 DLL 是一个本机库,我的应用程序通过另一个 DLL 引用它,该 DLL 是本机库的 c# 包装器。

我最初的直觉是,这个 DLL 必须引用一些其他库,而这些库在有问题的 PC 上不存在,但我无法想象这台 PC 可能缺少其他非开发 PC 具有的库。

所以我的问题是:有没有办法确定给定 DLL 文件的依赖关系?请记住,有问题的 DLL 是本机库(即不是托管代码),我无权访问它的源代码。如果事实证明没有缺少依赖项,还有什么可能导致这样的问题?

【问题讨论】:

  • 您尝试加载的本机库是否会针对不同于托管进程(例如 x64)的 CPU 架构(例如 x86)进行编译?
  • @Darin Dimitrov:这通常会导致 BadImageFormatException。
  • @dtb,没错,这只是我想到的第一件事。
  • 架构匹配。有问题的 PC 与我的开发 PC 具有相同的硬件和操作系统规格。
  • 使用 SysInternals 的 ProcMon 解决此问题。您将看到程序在 PATH 上的目录中搜索丢失的 DLL。需要进入并行缓存的缺少运行时支持库是典型的顺便说一句。

标签: c# .net dll dependencies dllnotfoundexception


【解决方案1】:

对于非托管 dll,您可以使用 Dependency Walker 查找依赖项。

【讨论】:

  • 谢谢,我找到了一个 Dependency Walker 镜像。它仅列出 MSVCP100.DLL、MSVCR100.DLL 和 KERNEL32.DLL 作为此库的依赖项。据我所知,这些 DLL 应该在 c:\Windows\System32 目录中。我会检查以确保有问题的 PC 具有这些 DLL。
  • 我认为 MSVCR 是 Visual C++ 运行时,而 AFAIK 它不包含在 Windows 中。至少他在旧版本的 Windows 上使用了新版本。它安装了许多程序,因此经常但并不总是存在。不知道 MSVCP,但我想情况可能类似。
  • 这听起来可能是罪魁祸首。在用户离开一天之前,我无法检查问题 PC,但如果这是问题所在,那么我想仅复制这两个 DLL 是不够的。如果我错了,请纠正我,但我可能必须安装这样的东西:microsoft.com/download/en/details.aspx?id=14632
  • 我通常会解决我与运行时静态链接的问题,但你不能这样做,因为你没有源代码。如果我记得正确地直接复制文件是可行的,但我不知道在什么情况下您可以合法地分发它们。
  • Dependency Walker 很棒!
【解决方案2】:

我建议先使用 ILSpy 打开 dll 并查看其依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多