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

Ing*_*son 105 c# c++ dll pinvoke

我有我需要在我的.NET 4.0应用程序中使用的非托管C++ API代码的DLL库.但我尝试加载我的DLL的每个方法都会出错:

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

我已阅读并尝试了我在互联网上找到的severa解决方案.什么都行不通..

我尝试过使用以下方法:

[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);
Run Code Online (Sandbox Code Playgroud)

当我尝试按照这篇文章和我运行这个例子时(从下载的代码中)它运行没有问题(使用的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);
Run Code Online (Sandbox Code Playgroud)

有什么建议?

小智 87

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

  1. 当前目录
  2. 系统文件夹,C:\windows\system32 or c:\windows\SysWOW64(对于64位盒上的32位进程).
  3. Path环境变量中读取

另外我会检查DLL的依赖关系,Visual Studio提供的依赖walker可以帮助你在这里,它也可以免费下载:http://www.dependencywalker.com

  • 我可以在我的系统上找到的每个DLL都有DependencyWalker声称不同的CPU类型存在错误 - 甚至是System.Web.Mvc.dll.这里有一些误报. (5认同)
  • 发现一些依赖项缺失(Oracle和IE中的一些dll).需要安装Oracle,因为我的dll依赖于那个..然后我会知道:)发现DependencyWalker的问题;) (3认同)
  • 在我的情况下,问题是试图加载为Debug编译的C++ DLL.这需要C++调试运行时,这意味着您必须安装Visual Studio.或者重新编译DLL for Release,并安装C++运行时可分发. (2认同)

Ant*_*ard 39

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

dumpbin /DEPENDENTS my.dll
Run Code Online (Sandbox Code Playgroud)

这将告诉您DLL需要加载哪些DLL.特别注意MSVCR*.dll.我已经看到在未安装正确的Visual C++ Redistributable时出现错误代码.

您可以从Microsoft网站获取"Visual Studio 2013的Visual C++ Redistributable Packages".它安装c:\ windows\system32\MSVCR120.dll

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

请注意,对于DLL的目标平台,您拥有正确的Visual Studio版本(10.0 = VS 10,11 = VS 2012,12.0 = VS 2013 ...)正确的架构(x64或x86),并且您还需要小心调试版本.DLL的调试版本依赖于MSVCR120d.dll,它是库的调试版本,它与Visual Studio一起安装,但不是由Redistributable Package安装.

  • 添加VS C++可再发行组件对我来说是这样的!需要v10.0(2010).非常感谢!!! (5认同)

Hea*_*ter 11

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

  • 是否可以将所有依赖项放在System32文件夹中,将我的dll放在其他地方? (3认同)

Jer*_*son 10

DLL必须位于bin文件夹中.

在Visual Studio中,我将dll添加到我的项目中(不是在引用中,而是"添加现有文件").然后将dll的"复制到输出目录"属性设置为"如果更新则复制".


Jee*_*Lee 9

无法加载 DLL 'xxx.dll':找不到指定的模块。(HRESULT 异常:0x8007007E)”表示可以找到该文件,但无法加载它。尝试将 DLL 文件复制到应用程序的根文件夹中,应用程序的根文件夹中需要有一些 DLL 库才能使其正常工作。或者检查是否还有其他依赖它的DLL文件。

Cannot find DLL 'xxx.dll': ...”表示无法找到该文件。尝试检查路径。例如,[DllImport(@"\Libraries\Folder\xxx.dll")]


Bla*_*ack 6

这是一个“麻烦”,您至少可以使用它进行健全性测试:尝试在代码中对DLL的路径进行硬编码

[DllImport(@"C:\\mycompany\\MyDLL.dll")]
Run Code Online (Sandbox Code Playgroud)

话说回来; 在我的情况下,dumpbin /DEPENDENTS按照@ anthony-hayward的建议运行,并将那里列出的DLL的32位版本复制到我的工作目录中,为我解决了这个问题。

该消息有点误导,因为它不是无法加载的“我的” dll-它是依赖项


Fel*_*ano 5

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