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

标签 c# c++ .net dll pinvoke

我有一个 .Net 应用程序,它依赖于一个名为 Procarper.dll 的非托管 dll。当我在我的个人机器上运行它时,应用程序运行得非常好。

当我将同一个应用程序复制到我的服务器 (Windows 2008) 并尝试在那里运行它时,它失败并显示以下错误消息。

我使用实际应用程序进行测试的原因是,这最初在我的 WCF 服务中失败了。

System.DllNotFoundException: Unable to load DLL 'C:\Warper\Procarper.dll': The specified module could not be found. (Exception from 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。DependencyWalker 将以红色显示缺少的依赖项或 objective-c PU 不匹配)。

  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. 我将 Procwarper.dll 加载到计算机 A(应用程序运行的计算机)上的 dependencywalker 中。 Dependencywalker 没有显示任何问题。

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

  4. 我把电脑A的windows\System32文件夹复制到电脑B的APP FOLDER

  5. 我重新运行 dependencywalker。它现在显示缺少依赖项,但我仍然遇到错误,因为 System32 中的 .dll 是 64 位的。

  6. 我快速谷歌了一下,发现 SysWow64 文件夹包含那些 System32 dll 的 32 位版本。

  7. 我将这两个复制到计算机 B,一切正常。复制到应用文件夹

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

希望这对某人有帮助。

关于c# - PInvoke - 找不到指定的模块。如何检查缺少的依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25819536/

相关文章:

c++ - 递增++i、i++ 和 i+=1

c# - 如何使用 SQUID 代理验证 .NET2 Web 服务

c# - 使用 JSON.NET 生成具有额外属性的 JSON 模式

c# - 如何安装额外的 .NET 库?

C++ - 使用类模板时出错

c++ - 反向C++ vector <char>

c# - ASP.NET MVC 中异步编程的最佳实践是什么?

.net - ASP.NET 按钮和覆盖渲染事件

c# - 在我的构建输出中包含 Nuget 依赖项?

c# - Fluent NHibernate 加入不使用主键