【问题标题】:finding dll for "The specified module could not be found" [duplicate]为“找不到指定的模块”查找dll [重复]
【发布时间】:2012-11-08 10:00:39
【问题描述】:

我有一个调用 C++ dll 的 32 位 .Net 应用程序 winform。我们将应用程序打包到一个安装程序中,它可以在至少 20 台左右的机器上安装和运行良好。该应用程序最初是在 Win 7 x64 机器(我的)上开发并运行良好。

但是,当我在老板桌面 (Win 7 x64) 上运行它时,应用程序将无法启动。 哦对了……

当我尝试启动应用程序时,我得到一个 JIT 对话框

System.IO.FileNotFoundException:找不到指定的模块。 (HRESULT 异常:0x8007007E)

当我运行依赖于老板机器上的 exe 时,它​​说 app exe 是 x86,但所有依赖的 dll 都是 x64 并将其标记为错误。当我运行取决于我机器上的应用程序时,exe 和 dll 都标记为 x86。

这怎么会在机器之间发生变化?安装程序只是以正常方式解包和复制,并且在许多其他 x64 机器上都可以正常工作...

当然,它只会在两小时外的他的机器上发生故障,而且我们即将举办一场贸易展。叹。 很迷茫……

=================已解决===================

所以我们修复了它。找到丢失的 dll 有点棘手。

首先我们搞砸了,我们为 x64 机器运行了错误版本的 depends。所以它错误地报告应用程序正在寻找 x64 dll。如果我们运行了正确的版本,我想我们会更快地发现问题。

解决这个问题的方法是查看 System Internals 中的 Process Monitor 日志。它记录每个文件访问和注册表读取。日志很快显示 Direct X 11 dll 读取失败。

原来来自其他应用程序的先前安装程序已安装 一些 DX11 dll。这欺骗了我们的安装程序,它跳过了 DirectX 11 步骤,因此我们缺少 dll。

感谢大家的帮助!

【问题讨论】:

  • 如果您提供有关尝试加载为 x64 的 DLL 的更多详细信息,将会更容易为您提供帮助。它们是 .NET 程序集、您自己的 C++ DLL 还是系统 DLL?另外,您运行的是 x86 还是 x64 版本的 Dependency Walker?
  • 我怀疑该 DLL 有同名的 32 位和 64 位版本。您应该更改清单以确保选择正确的版本。
  • Depends 适用于本机程序,而不是 .net。这里没有足够的信息来提供帮助。你需要找出哪个模块没有找到。
  • @DavidHeffernan:Depends 将处理混合程序集并为原生部分提供正确的信息。因为这里(显然)有一个原生 C++ 部分,所以使用 Depends 是正确的。
  • @MSalters 除了原生部分 pinvoke 是在运行时加载的,最终加载的是LoadLibrary,所以我认为depends 对此无话可说。

标签: c++ .net windows 64-bit windows-installer


【解决方案1】:

这是一个简单的“找不到文件”类型的错误,但具有非常尴尬的行为,它没有告诉您什么 DLL 找不到。这可能是 C++ DLL,但也可能是它可能具有的任何隐式 DLL 依赖项。像运行时支持 DLL 一样,很容易错过,您可以使用 vcredist 安装程序部署它们。或者部署 DLL 的 Debug 构建,那是行不通的。

要获得体面的诊断需要打开加载程序快照和调试器。在没有安装工具的机器上总是很难做到。 SysInternals 的 ProcMon 实用程序是一个很好的替代方案,您将看到该程序正在搜索 DLL。尽管您会淹没在它生成的大量跟踪数据中。从跟踪的底部向后工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2020-07-02
    • 2020-06-30
    相关资源
    最近更新 更多