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++了。

根据以上信息,有人能帮助我确定什么是失败的吗?

我很乐意提供更多信息,请询问,我会提供。

PInvoke-找不到指定的模块.如何检查缺少的依赖项

因此,如果有人遇到类似的情况,希望我的经验能有所帮助。

以下是我解决问题的方法。(提示:在出现问题的计算机上安装DependencyWalker,并遍历出现问题的.dll。Dependency沃克将以红色显示丢失的依赖项或目标CPU不匹配)。

  1. 我知道应用程序在A电脑上运行。我知道同样的应用程序在B电脑上失败了。

  2. 错误消息为"找不到指定的模块"。我专注于实际的.dll.

  3. 在现实中,错误与找不到.dll无关。相反,它找不到Procwarper.dll所依赖的依赖项。在这种情况下,即:

MSVCP120D.DLL和MSVCR120D.DLL

  1. 为了确定#3,我使用了dependencywalker(www.dependencywaller.com)。由于我知道.dll是32位的,所以我安装了32位版本的dependencywalker。

  2. 我将Procwarper.dll加载到计算机A(应用程序工作的计算机)上的dependencywalker中。Dependencywalker没有表现出任何问题。

  3. 我将dependencywalker加载到计算机B上(应用程序出现故障)。DependencyWalker显示了两个缺失的依赖项(上面显示的两个)。

  4. 我把那些从计算机A的windows''System32文件夹复制到计算机B的应用程序文件夹

  5. 我是一个依赖行者。现在它显示了现在丢失的依赖项,但我仍然有一个错误,因为System32中的.dll是64位的。

  6. 我快速搜索了一下,发现SysWow64文件夹中有32位版本的System32 dll。

  7. 我把这两个复制到B电脑上,一切都正常了。复制到APP文件夹

难以置信。现在我知道他们为什么把它称为".dll地狱"了。

希望这能帮助到别人。