我有一个调用C ++ DLL的32位.Net应用程序winform。我们将应用程序打包到安装程序中,并在至少20台左右的机器上安装并运行良好。该应用程序最初开发并在Win 7 x64机器(我的)上运行良好。
然而,当我在我的老板桌面(Win 7 x64)上运行它时,应用程序将无法启动。 哦,是的......
当我尝试启动应用程序时,我得到一个带
的JIT对话框System.IO.FileNotFoundException:找不到指定的模块。 (HRESULT异常:0x8007007E)
当我运行依赖于老板机器上的exe时,它表示app exe是x86但是x64处的所有依赖dll并将其标记为错误。当我运行依赖于我的机器上的应用程序时,exe和dll都标记为x86。
这怎么会在机器之间改变?安装程序只是以正常方式解压缩和复制,并在许多其他x64机器上正常工作......
自然它只会在两小时后的机器上打破,我们有一个贸易展即将到来。叹。 非常困惑......
=================解决==================
所以我们修好了。找到丢失的dll有点棘手。
首先,我们搞错了,我们为x64框运行了错误版本的depends。所以它错误地报告该应用程序正在寻找x64 dll。如果我们运行了正确的版本,我想我们会早点发现问题。
为我们解决的是从System Internals查看Process Monitor的日志。它记录每个文件访问和注册表读取。该日志很快显示Direct X 11 dll读取失败。
事实证明,其他应用程序的先前安装程序已经安装了某些的DX11 dll。这欺骗了我们的安装程序,它跳过了DirectX 11步骤,所以我们丢失了一个dll。
感谢帮助人员!
答案 0 :(得分:3)
这是一个简单的“找不到文件”的错误,但是有一个非常尴尬的行为,它没有告诉你无法找到什么 DLL。这可能是C ++ DLL,也可能是它可能具有的任何隐式DLL依赖项。与运行时支持DLL(通常是错过的)一样,您可以使用vcredist安装程序部署它们。或部署DLL的Debug版本,这是行不通的。
获得一个不错的诊断需要打开加载器快照和调试器。在没有安装工具的机器上总是很难做到。 SysInternals的ProcMon实用程序是一个很好的选择,您将看到程序搜索DLL。虽然你会淹没它产生的跟踪数据量。从追踪的底部向后工作。