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

问题描述 投票:110回答:17

我有一个包含非托管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);

[当我尝试遵循this article并运行本示例(从下载的代码中)时,它运行没有问题(所使用的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);

有什么建议吗?

我有一个包含非托管C ++ API代码的dll库,需要在.NET 4.0应用程序中使用。但是我尝试加载dll的每种方法都出现错误:无法加载DLL'MyOwn.dll':指定的模块...

c# c++ dll pinvoke
17个回答
88
投票

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


2
投票

如果DLL和.NET项目位于同一解决方案中,并且您希望每次都编译并运行它们,则可以右键单击.NET项目的属性Build事件,然后在Post-构建事件命令行:


2
投票

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


2
投票

在我的情况下,一个不受管理的dll依赖于另一个丢失的dll。在这种情况下,错误将指向现有的dll,而不是缺少的dll,这可能会造成混淆。


1
投票

我认为您的非托管库需要清单。Here是如何将其添加到二进制文件中。 here是为什么。


1
投票

Setup


1
投票

我遇到了相同的问题,就我而言,我有两台32位PC。一台已安装.NET4.5,另一台是新PC。


0
投票

[在c#环境中使用不受管理的c / c ++ dll文件时,也会遇到相同的问题。


0
投票

[。Net Framework +4中导入C ++ Dll时遇到相同的问题,我未选中Project-> Properties-> Build-> Prefer 32-bit,它为我解决了。


40
投票

您可以使用dumpbin工具找出所需的DLL依赖项:


12
投票

这是一个'kludge'但是


11
投票

尝试输入dll的完整路径。如果不起作用,请尝试将dll复制到system32文件夹。


11
投票

DLL必须在bin文件夹中。


4
投票

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


4
投票

[有一件非常有趣的事(并且与技术相关)可能会浪费您的时间,因此请考虑在此处共享它-


3
投票

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


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.