【发布时间】: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