我有一个.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 ++已经很长时间了。
根据以上信息,任何人都可以帮我确定失败的原因吗?
我很乐意提供更多信息,请询问,我会提供。
答案 0 :(得分:2)
所以如果有人碰到类似的东西,希望我的经验可以提供帮助。
以下是我解决问题的方法。 (提示:在给你问题的机器上安装DependencyWalker,然后使用.dll你遇到问题.DependencyWalker将显示缺少的依赖关系或目标CPU不匹配的红色)。
我知道应用程序是在计算机A上运行的。我知道同一个应用程序在计算机B上运行失败。
错误消息是“无法找到指定的模块”。我专注于实际的.dll。
在现实中,错误与无法找到.dll的事实无关。相反,事实是它无法找到Procwarper.dll所依赖的依赖项。在这种情况下即:
MSVCP120D.DLL和MSVCR120D.DLL
为了确定#3,我使用了dependencywalker(www.dependencywalker.com)。由于我知道.dll是32位,我安装了32位版本的dependencywalker。
我将Procwarper.dll加载到计算机A(应用程序工作的那个)上的dependencywalker中。 Dependencywalker没有表现出任何问题。
我将dependencywalker加载到计算机B上(应用程序失败)。 DependencyWalker显示了两个缺少的依赖项(上面显示的两个)。
我将那些从计算机A的Windows \ System32文件夹复制到计算机B APP文件夹
我是依赖行者。它现在显示缺少依赖项,但我仍然有一个错误,因为System32中的.dll是64位。
我做了一个快速谷歌,发现SysWow64文件夹保存了那些System32 dll的32位版本。
我将这两个复制到了计算机B,一切正常。复制到APP文件夹
原谅。现在我知道为什么他们把它称为“.dll hell”。
希望这有助于某人。