10

我有一个调用 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机器运行了错误版本的依赖。所以它错误地报告应用程序正在寻找 x64 dll。如果我们运行了正确的版本,我想我们会更快地发现问题。

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

事实证明,以前来自其他应用程序的安装程序已经安装了一些DX11 dll。这愚弄了我们的安装程序,它跳过了 DirectX 11 步骤,因此我们丢失了 dll。

谢谢你们的帮助!

4

1 回答 1

10

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

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

于 2012-11-20T15:02:33.000 回答