PInvoke-找不到指定的模块.如何检查缺少的依赖项
本文关键字:检查 依赖 何检查 找不到 模块 PInvoke- | 更新日期: 2023-09-27 18:21:40
我有一个.Net应用程序,它依赖于一个名为Procarper.dll的非托管dll。当我在我的个人计算机上运行它时,该应用程序运行得非常好。
当我将同一应用程序复制到我的服务器(Windows 2008)并尝试在那里运行时,它失败了,并显示以下错误消息。
我之所以使用实际的应用程序进行测试,是因为它最初在我的WCF服务中失败了。
System.DllNotFoundException:无法加载DLL"C:''Warper''Procarper.dll":找不到指定的模块。(HRESULT:0x8007007E的异常)
PInvoke签名如下(我将路径硬编码为测试……它通常只是相对的):
[DllImport(@"C:'Warper'Procarper.dll", EntryPoint = "CreateProcr", CallingConvention = CallingConvention.Cdecl)]
private static extern int CreateProcr(int width, int height, int scanWidth, int bpp, IntPtr rawData);
我正在研究dependencywalker,但老实说,我不知道如何真正判断它告诉我的是什么,我已经很久没有使用C++了。
根据以上信息,有人能帮助我确定什么是失败的吗?
我很乐意提供更多信息,请询问,我会提供。
因此,如果有人遇到类似的情况,希望我的经验能有所帮助。
以下是我解决问题的方法。(提示:在出现问题的计算机上安装DependencyWalker,并遍历出现问题的.dll。Dependency沃克将以红色显示丢失的依赖项或目标CPU不匹配)。
-
我知道应用程序在A电脑上运行。我知道同样的应用程序在B电脑上失败了。
-
错误消息为"找不到指定的模块"。我专注于实际的.dll.
-
在现实中,错误与找不到.dll无关。相反,它找不到Procwarper.dll所依赖的依赖项。在这种情况下,即:
MSVCP120D.DLL和MSVCR120D.DLL
-
为了确定#3,我使用了dependencywalker(www.dependencywaller.com)。由于我知道.dll是32位的,所以我安装了32位版本的dependencywalker。
-
我将Procwarper.dll加载到计算机A(应用程序工作的计算机)上的dependencywalker中。Dependencywalker没有表现出任何问题。
-
我将dependencywalker加载到计算机B上(应用程序出现故障)。DependencyWalker显示了两个缺失的依赖项(上面显示的两个)。
-
我把那些从计算机A的windows''System32文件夹复制到计算机B的应用程序文件夹
-
我是一个依赖行者。现在它显示了现在丢失的依赖项,但我仍然有一个错误,因为System32中的.dll是64位的。
-
我快速搜索了一下,发现SysWow64文件夹中有32位版本的System32 dll。
-
我把这两个复制到B电脑上,一切都正常了。复制到APP文件夹
难以置信。现在我知道他们为什么把它称为".dll地狱"了。
希望这能帮助到别人。