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

154

我有一个带有非托管C++ API代码的dll库,我需要在我的.NET 4.0应用程序中使用它。但是每次我尝试加载我的dll时,我都会收到以下错误:

无法加载DLL'MyOwn.dll':找不到指定的模块。(来自HRESULT的异常:0x8007007E)

我已经阅读并尝试了在互联网上找到的几种解决方案。但没有任何作用。

我已经尝试使用以下方法:

[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);

有什么建议吗?

20个回答

3

打开融合日志记录,参见此问题以获取有关如何执行此操作的大量建议。调试混合模式应用程序加载问题可能非常困难。融合日志记录可以提供很大的帮助。


2

当我将我的应用程序部署到测试PC时,我遇到了同样的问题。问题是开发PC上有msvcp110d.dllmsvcr110d.dll,但测试PC没有。

我在InstalledSheild中添加了“Visual Studio C++ 11.0 DebugCRT(x86)”合并模块,然后问题得以解决。希望对其他人有所帮助。


根据微软的许可协议,您不被允许在您的安装程序中分发调试CRT(C运行时库)——这是有很好的理由的。甚至存储它的文件夹都被称为“debug_nonredist”,意味着不可再分发。 - Igor Levicki

1
如果DLL和.NET项目在同一个解决方案中,并且您希望每次编译和运行两者,您可以右键单击.NET项目的属性,选择“生成事件”,然后在“后生成事件命令行”中添加以下内容:
copy $(SolutionDir)Debug\MyOwn.dll .

这基本上是一个DOS命令行,你可以根据DLL构建的位置进行微调。


0
当我在.Net Framework +4中导入C++ Dll时,我遇到了同样的问题。我取消了项目->属性->生成->首选32位,并解决了这个问题。

0

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

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

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

3.检查是否缺少PDB(程序数据库)文件。这个视频可以让你更好地理解pdb文件。

当在64位系统中运行32位C/C++二进制代码时,可能会出现平台不兼容的情况。您可以从“生成”>“配置管理器”中进行更改。


0
我认为您的未托管库需要一个清单文件。这里是如何将其添加到二进制文件中的,这里是为什么需要这样做。
总之,您的计算机中可能安装了多个Redistributable库版本,但只有其中一个适用于您的应用程序,并且它可能不是默认版本,因此您需要告诉系统您的库需要哪个版本,这就是为什么需要清单文件的原因。

0

设置: 32位Windows 7

背景: 安装了一个PCI-GPIB驱动程序,但由于上述问题无法进行通信。

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

详细回答: 我还使用了Dependency Walker,它识别出了几个缺失的依赖模块。立即想到这必须是一个失败的驱动程序安装。我不想检查和还原每个缺失的文件。

无法在控制面板的程序和功能下找到卸载程序也表明安装失败。我不得不手动删除\system32中的一些*.dll和注册表键,以允许重新安装驱动程序。

问题已经解决。

意外的是,并非所有依赖模块都得到了解决。尽管如此,现在可以引用感兴趣的*.dll。


0

我们的解决方案中有一个C++项目,在我们的构建主机上出现了错误,而其他人则没有问题。

在我们的情况下,这是因为该特定项目在其.vcxproj文件中设置了<WindowsTargetPlatformVersion>为"10.0",而不是像我们所有其他C++项目一样设置为"10.0.18362.0"。

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

我们的构建主机可能在他的机器上留下了较新的SDK残留,而MSBuild正在尝试使用它(因此未找到RC.exe)。

无论如何,打开项目的属性页并将配置属性 > 常规 > Windows SDK版本更改为"10.0.18362.0"(或您安装的特定版本的SDK)对于项目的所有配置/平台都可以解决问题。


0
我遇到了同样的问题,在我的情况下,我有两个32位的电脑。一个安装了.NET4.5,另一个是全新的PC。
我的32位cpp dll(发布模式构建)在安装了.NET的PC上运行良好,但在新PC上出现以下错误:
无法加载DLL“PrinterSettings.dll”:找不到指定的模块。(来自HRESULT的异常:0x8007007E)
最终,
我只需在Debug模式下重新构建我的项目,这次我的cpp dll就能正常工作了。

-2

如果您已经检查了所有依赖项并确保它们都存在,那么与依赖项无关;如果文件不在错误的目录中,或者传递给 DLL 的参数不正确,那么也与之无关。 DLL 无法使用 LoadLibrary 加载自身... 您可以检查从 LoadLibrary 返回的地址是否始终为 0x0000000(未加载)。

我也找不到这个错误出在哪里。在 Windows 7 上没问题,但在 Windows 10 上就不行了。然而,我解决了这个问题,与缺少依赖项或运行时可再发行包无关。

问题在于我必须使用 upx 对 DLL 进行打包,然后它又开始工作了。

旧版 Windows XP 操作系统上的文件编译和解压似乎会导致糟糕的 PE Header 或错误的文件格式等问题,但使用 UPX 打包就能解决问题,现在 DLL 的体积小了3倍哈哈。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接