为“找不到指定的模块”找到dll

mei*_*rsd 3 .net c++ windows 64-bit windows-installer

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

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

当我尝试启动该应用程序时,出现一个JIT对话框

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

当我运行时依赖于老板计算机上的exe时,它说该应用程序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。

感谢您的帮助!

Han*_*ant 5

这是一个简单的“找不到文件”错误,但是由于行为很尴尬,它无法告诉您找不到哪个 DLL。这可能是C ++ DLL,也可能是任何隐式DLL依赖项。像很常见的运行时支持DLL一样,您可以使用vcredist安装程序进行部署。或部署DLL的Debug版本无法正常工作。

要获得良好的诊断,需要打开加载程序快照和调试器。在没有安装工具的机器上总是很难做。SysInternals的ProcMon实用程序是一个很好的选择,您将看到程序搜索DLL。尽管您会淹没它生成的大量跟踪数据。从跟踪的底部开始倒退。