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

问题描述 投票:0回答:1

我有一个.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);

我正在看看依赖行者,但老实说,我不知道如何真正判断它是什么告诉我,因为我必须使用C ++已经很长时间了。

根据以上信息,任何人都可以帮我确定失败的原因吗?

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

c# c++ .net dll pinvoke
1个回答
2
投票

所以,如果有人碰到类似的东西,希望我的经验可以帮助你。

这就是我解决问题的方法。 (提示:在给你问题的机器上安装DependencyWalker并使用.dll你遇到问题.DependencyWalker将显示缺少的依赖关系或目标CPU不匹配的红色)。

  1. 我知道应用程序在计算机A上运行。我知道同一个应用程序在计算机B上失败
  2. 错误消息是“找不到指定的模块”。我专注于实际的.dll。
  3. 在REALITY中,错误与无法找到.dll的事实无关。相反,事实是它找不到Procwarper.dll所依赖的依赖。在这种情况下:

MSVCP120D.DLL和MSVCR120D.DLL

  1. 为了确定#3,我使用了dependencywalker(www.dependencywalker.com)。由于我知道.dll是32位,我安装了32位版本的dependencywalker。
  2. 我在计算机A(应用程序工作的那个)上将Procwarper.dll加载到dependencywalker中。 Dependencywalker没有表现出任何问题。
  3. 我将dependencywalker加载到计算机B上(应用程序失败)。 DependencyWalker显示了两个缺少的依赖项(上面显示的两个)。
  4. 我将那些从计算机A的Windows \ System32文件夹复制到计算机B APP文件夹
  5. 我是依旧行者。它现在显示现在缺少依赖项,但我仍然有一个错误,因为System32中的.dll是64位。
  6. 我做了一个快速的谷歌,发现SysWow64文件夹保存那些System32 DLL的32位版本。
  7. 我将这两个复制到计算机B,一切正常。复制到APP文件夹

难以置信的。现在我知道他们为什么称它为“.dll hell”。

希望这有助于某人。

© www.soinside.com 2019 - 2024. All rights reserved.