无法加载 DLL (找不到模块 HRESULT T: 0x8007007E)

我有一个包含非托管 C + + API 代码的 dll 库,我需要在我的。NET 4.0应用程序。但是我尝试加载 dll 的每个方法都会得到一个错误:

无法加载 DLL‘ MyOwn.DLL’: 找不到指定的模块

我已经阅读和尝试了几个解决方案,我在互联网上找到的。没有工作. 。

我尝试过以下方法:

[DllImport("MyOwn.dll",  CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs((UnmanagedType.I4))]
public static extern Int32 MyProIni(string DBname, string DBuser_pass,
string WorkDirectory, ref StringBuilder ErrorMessage);

当我尝试跟随 这篇文章并运行这个示例(从下载的代码)时,它运行没有问题(使用的 dll 位于 bin/debug 文件夹中)

我已经将 dll (以及它所依赖的所有文件)复制到 bin 文件夹中。

我也尝试过这种方法,但得到了同样的错误:

[DllImportAttribute(MyOwnLibDllPath, EntryPoint="TMproIni")]
[return: MarshalAs(UnmanagedType.I4)]
public static extern  int MyproIni(string DBname, string DBuser_pass,
string WorkDirectory, ref StringBuilder ErrorMessage);

有什么建议吗?

450813 次浏览

尝试输入 dll 的完整路径。 如果它不工作,尝试复制到系统32文件夹的 dll。

确保您自己的 dll 的所有依赖项都存在于 dll 附近或 System32中。

根据我在 Windows 上的记忆,dll 的搜索顺序是:

  1. 工作目录
  2. 系统文件夹,C:\windows\system32 or c:\windows\SysWOW64(用于64位机器上的32位进程)。
  3. Path环境变量读数

此外,我还要检查 DLL 的依赖关系,Visual Studio 提供的依赖遍历器可以帮助您解决这个问题,它也可以免费下载: http://www.dependencywalker.com

打开聚变测井,参阅 这个问题获得关于如何做到这一点的许多建议。调试混合模式的应用程序加载问题可能是一个巨大的痛苦。核聚变测井可以提供很大的帮助。

您可以使用转储工具查找所需的 DLL 依赖项:

dumpbin /DEPENDENTS my.dll

这将告诉您需要加载哪些 DLL。特别注意 MSVCR * 。DLL.我看到过当没有安装正确的 VisualC + + 可再发行版时出现错误代码。

您可以从 Microsoft 网站获得“ Visual C + + 可再发行包 for Visual Studio 2013”,它安装 c: windows system 32 MSVCR120.dll

在文件名中,120 = 12.0 = Visual Studio 2013。

请注意,您的 DLL 目标平台具有正确的 Visual Studio 版本(10.0 = VS10,11 = VS2012,12.0 = VS2013...)正确的体系结构(x64或 x86) ,还需要注意调试构建。DLL 的调试版本取决于 MSVCR120d.DLL,这是库的调试版本,它是通过 Visual Studio 安装的,但不是通过可再发行包安装的。

确保将 Build Platform Target 设置为 x86或 x64,以便它与 DLL 兼容—— DLL 可以为32位平台编译。

如果 DLL 和。NET 项目位于同一个解决方案中,如果希望每次都编译和运行这两个项目,可以右键单击。NET 项目,生成事件,然后向后期生成事件命令行添加如下内容:

copy $(SolutionDir)Debug\MyOwn.dll .

它基本上是一个 DOS 行,您可以根据构建 DLL 的位置进行调整。

我觉得你的非托管图书馆需要一份清单。
这里 是如何将它添加到您的二进制文件中,原因是 给你

总之,可以在你的机器上安装几个可再发行库版本,但是只有其中一个版本能够满足你的应用程序,而且它可能不是默认版本,所以你需要告诉系统你的库需要什么版本,这就是为什么清单。

我在部署应用程序测试 PC 时也遇到了同样的问题。问题是开发的 PC 只有 msvcp110d.dllmsvcr110d.dll,而没有测试的 PC。

我在 InstalledSheild 中添加了“ Visual Studio C + + 11.0 DebugCRT (x86)”合并模块,它工作正常。希望这对其他人有帮助。

DLL 必须在 bin 文件夹中。

在 VisualStudio 中,我将 dll 添加到我的项目“不在引用中”,而是“添加现有文件”。然后将 dll 的“ Copy to Output Directory”属性设置为“ Copy if new”。

安装 : 32位 Windows 7

上下文 : 安装了一个 PCI-GPIB 驱动程序,由于上述问题,我无法通过该驱动程序进行通信。

简短回答 : 重新安装驱动程序。

详细回答 : 我还使用了 依赖 Walker,它确定了几个缺失的依赖模块。我马上想到,这一定是一个拙劣的驱动程序安装。我不想检查和恢复每个丢失的文件。

事实上,我无法找到下程序和控制面板的功能卸载是另一个安装不良的指标。我不得不手动删除了几个 * 。系统32中的 dll 和注册表项,以允许重新安装驱动程序。

问题解决。

出乎意料的是,并非所有的依赖模块都被解析了,不过,现在可以引用感兴趣的 * . dll 了。

有一件非常有趣的事情(有一个技术相关性)可能会浪费你的时间,所以想到在这里分享它-

我创建了一个控制台应用项目 ConsoleApplication1和一个类库项目 ClassLibrary1

ClassLibrary1.dll中包含了所有用于调用 p/的代码。因此,在从 Visual Studio 调试应用程序之前,我只需将 C + + 非托管程序集(myUnmanagedFunctions.dll)复制到 ClassLibrary1项目的 \bin\debug\目录中,以便 CLR 可以在运行时加载它。

我一直在想

无法加载 DLL

几个小时的错误。后来我意识到,所有这些要加载的非托管程序集都需要复制到启动项目 ConsoleApplication1\bin\debug目录中,ConsoleApplication1通常是一个 win 表单、控制台或 Web 应用程序。

所以请注意,在接受的答案中的 Current Directory实际上意味着 Current Directory的主要可执行文件从您的应用程序进程开始。看起来很明显,但有时可能并非如此。

Lesson Learnt -始终将非托管 dls 放在启动可执行文件所在的同一目录中,以确保可以找到它。

这是一个“组装”的 但是,你至少可以用它来测试你是否清醒: 尝试硬编码代码中 DLL 的路径

[DllImport(@"C:\\mycompany\\MyDLL.dll")]

话虽如此,在我的例子中,按照@anthony-hayward 的建议运行 dumpbin /DEPENDENTS,并将其中列出的 dLL 的 32位版本复制到我的工作目录中,为我解决了这个问题。

这个消息只是有点误导,因为不能加载的不是“ my”dll,而是依赖项

我遇到了同样的问题,在我的情况下,我有两个32位个人电脑。 其中一个安装了.NET4.5,另一个是新的个人电脑。

我的32位 cpp dll (发布模式构建)可以很好地工作。NET 安装的电脑,但没有与新的电脑,我得到了下面的错误

无法加载 DLL‘ PrinterSettings.DLL’: 指定的模块不能是 (来自 HRESULT T: 0x8007007E 的异常)

最后,

我刚刚在 调试模式配置中构建了我的项目,这次我的 Cpp dll 工作正常。

在 c # 环境中使用非托管的 c/c + + dll 文件时也面临同样的问题。

1. 检查 dll 与32位或64位 CPU 的兼容性。

2. 检查了 DLL.bin 文件夹、 system32/sysWOW64或给定路径的正确路径。

检查 PDB (程序数据库)文件是否丢失。这个 视频给你最好的答案 了解 PDB 文件。

在64位系统中运行32位 C/C + + 二进制代码时,由于平台不兼容会出现这种情况。您可以从 Build > Configuration manager 更改它。

在我的例子中,一个非托管 dll 依赖于另一个丢失的 dll。在这种情况下,错误将指向现有的 dll,而不是缺少的那个,这可能会造成真正的混淆。

我的情况就是这样,希望这能帮到别人。

我在导入 C + + Dll 时遇到了同样的问题。Net Framework + 4,我取消选中 Project-> Properties-> Build-> Prefer32-bit,它为我解决了这个问题。

”找不到指定的模块。(例外: 0x8007007E)”意味着找到了文件 可以,但是无法加载它。如果要将 DLL 文件复制到应用程序的根文件夹中,则需要在应用程序的根文件夹中提供一些 DLL 库,以便其工作。或者检查它是否需要任何其他依赖 DLL 文件。

找不到 DLL‘ xxx.DLL’:...”表示找到文件 不能。尝试检查路径。例如,[DllImport(@"\Libraries\Folder\xxx.dll")]

如果你检查了所有的依赖关系并且你知道你已经得到了所有的依赖关系,那么它与依赖关系没有任何关系,它与文件位于错误的目录或者传递给 DLL 的不正确的 ARGUMENT 没有任何关系,使用 LoadLibrary 本身加载 DLL 失败。.您可以检查从 LoadLibrary 返回的地址始终是 0x0000000(未加载)。

我也想不出这个错误,它在 Windows7上工作得很好,但是在 Windows10上不工作。我修复了这个问题,尽管它与缺少依赖项或运行时可再发行包没有任何关系。

问题是我不得不用 upx 打包 DLL,然后它又开始工作了。

在旧的 Windows XP 操作系统上解压和编译文件时会产生一个糟糕的 PE 头文件或糟糕的文件格式之类的东西,但是用 UPX 打包这个技巧现在很管用,DLL 变小了3倍,哈哈。

我在我们的解决方案中得到了 C + + 项目的这个错误,并且只在我们的构建主机上得到了这个错误。我们其他人可以毫无问题地建造它。

在我们的案例中,这是因为在我们所有其他 C + + 项目中,.vcxproj文件中的 <WindowsTargetPlatformVersion>被设置为“10.0”而不是“10.0.18362.0”。

没有指定整个 SDK 版本号似乎允许 MSBuild 选择最新版本(?)SDK 和相关的构建工具。

我们的构建器可能在他的机器上有一个较新的 SDK 的残余,而 MSBuild 正在尝试使用它(因此没有找到 RC.exe)。

无论如何,在项目的所有配置/平台上打开项目的属性页并将 配置属性 > 将军 > WindowsSDK 版本修改为“10.0.18362.0”(或者你已经安装的 SDK 的任何特定版本)都可以达到目的。