DllNotFoundException with HRESULT 0x8007007E when loading 64

本文关键字:loading when 0x8007007E with HRESULT DllNotFoundException | 更新日期: 2023-09-27 18:35:24

我下载了zlib并将库编译为Windows 32位和Windows 64位dll。我现在有zlibwapi.dllzlibwapi64.dll.

dll 将复制到我的应用程序文件夹中,并按如下方式引用:

[DllImport(@"zlibwapi.dll",   EntryPoint = "uncompress", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = false)]
private static extern int uncompress32(
    IntPtr dest,
    ref uint destLen,
    [In(), MarshalAs(UnmanagedType.LPArray)] byte[] source,
    uint sourceLen
);
[DllImport(@"zlibwapi64.dll", EntryPoint = "uncompress", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = false)]
private static extern int uncompress64(
    IntPtr dest,
    ref uint destLen,
    [In(), MarshalAs(UnmanagedType.LPArray)] byte[] source,
    uint sourceLen
);

在运行时,我检查我是 32 位还是 64 位,并调用适当的版本。

如果我是 32 位,这工作正常,但 64 位版本给出

无法加载 DLL "zlibwapi64.dll":找不到模块。(HRESULT 例外:0x8007007E)

我在互联网上发现了许多类似的问题,建议的原因是图书馆依赖于其他一些库,而那些库可能找不到。
在情况似乎并非如此:

  • zlibwapi64.dll 仅依赖于内核 32.dll 和 MSVCR90.dll。我确实安装了VS2008 C++运行时,包括32位和64位。
  • 当我尝试从非托管C++应用程序加载 zlibwapi64.dll 时,它加载没有问题。是 C# 无法加载它。

我尝试将绝对路径设置为 64 位 dll,但没有帮助。

我如何让它工作?

DllNotFoundException with HRESULT 0x8007007E when loading 64

这是一个相当基本的"找不到文件"类型的错误,不幸的是,它没有明确告诉您它找不到的DLL。 您已经了解依赖 DLL 的问题。 请注意,您可以通过使用/MT 编译代码来避免对 msvcr90 的令人讨厌的依赖.dll

您需要调试问题,这需要深入了解它在哪里查找 DLL。 一个很好的工具是SysInternals的ProcMon实用程序,它准确地显示您的程序正在查找文件的位置。 您应该看到它正在探测 DLL,搜索 PATH 的目录,但找不到该文件。

不幸的是,ProcMon有点健谈,并且习惯于将您淹没在数据中。 一个更专用的工具是GFlags.exe,这是Windows调试工具包中提供的工具。 这些天包含在Windows SDK中。 存储在 c:''program 文件 (x86)''调试工具中.exe用于 Windows''gflags安装后。 您可以打开"显示加载器快照"选项。 在更高版本的Windows上,这告诉Windows加载程序在搜索DLL时生成调试消息。 启用非托管调试时,它们将显示在"输出"窗口中。

先试试ProcMon,更容易上手。

当然,请考虑纯托管解决方案,这样您就不会遇到此类安装问题。 好的是DotNetZip和SharpZipLib,这是他们的第一个谷歌点击。

检查 Dll 依赖项的另一个好工具是 Dependency walker (depends)。它以静态方式查看文件,因此比使用进程监视器容易一些。

http://www.dependencywalker.com/