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

4

错误: 无法加载 DLL 'x.dll':找不到指定的模块。(HRESULT Exception:0x8007007E)

操作系统: Windows 7

我有两个工作站,一个安装了Visual Studio 2012并且使用.net 4.0;另一个没有安装VS。 在安装VS2012的第一台工作站上,我有一个包含C++项目的C#解决方案。 我正在使用:

    [DllImport("x.dll", CallingConvention = CallingConvention.Cdecl)]
    [return: MarshalAs(UnmanagedType.I4)]

在这个站点上工作正常。

但当我转移到另一个没有安装VS的站点时,出现了错误。 如果我安装了VS,则可以正常工作。

导致此问题发生的可能原因有哪些?有什么想法可以帮助我找到问题并进行调试吗?

2个回答

11

最有可能的原因是没有安装Visual Studio的计算机缺少你的非托管DLL所需的C++运行时。从可下载的可再发行文件中安装适当的C++运行时。

确保您的非托管DLL已链接到发布运行时而不是调试运行时。后者无法重新分发。

使用Dependency Walker、Process Monitor等工具可以调试非托管DLL依赖性问题。


我安装了vcredist_x86_vs2012.exe文件。仍然出现相同的错误。我将尝试使用Dependency Walker。 - Ice
然后使用Dependency Walker来调试缺失的依赖项。如果您已将DLL链接到调试运行时环境,我一点也不会感到惊讶。 - David Heffernan
我使用Dependency Walker来调试缺失的依赖项,并观察到以下dll文件缺失:mfc110.dll,mfc111d.dll,msvcp110.dl,msvcp110d.dll,msvcr110.dll,msvcr110d.dll。解决方案:我将这些dll文件添加到Release文件夹中,现在程序可以正常运行了。我不知道为什么它无法从SysWOW64目录中找到这些dll文件。你有其他解决方案吗? - Ice
你已经链接到了调试运行库。你不能再重新分发它。请链接到发布版的运行库。显然你还依赖于MFC,也需要避免这种情况。 - David Heffernan

1

我遇到了同样的问题

  1. 使用Dependency Walker检查缺失的依赖项

  2. 在我的情况下,我缺少了msvcp110d.dllmsvcr110d.dll

  3. 我将这两个文件从我的开发PC复制到测试PC的C:\Windows\SysWOW64目录下,然后就可以工作了!

  4. 此外,您还可以将Visual Studio C++ 11.0 DebugCRT(x86)添加为InstallShield的依赖项,以使其正常工作


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