2012-01-25 138 views
77

我有我需要在我的.NET 4.0应用程序中使用的非托管C++ API代码的dll库。但是每一个方法我尝试加载我的DLL我得到一个错误:无法加载DLL(无法找到模块HRESULT:0x8007007E)

Unable to load DLL 'MyOwn.dll': The specified module could not be found. (Exception from 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); 

当我尝试以下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); 

有什么建议?

回答

11

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

+3

是它可以有所有依赖的System32文件夹和我的DLL在别的地方? –

4

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

74

从我在Windows记得一个DLL搜索顺序是:

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

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

+2

发现一些依赖关系丢失(来自IE的Oracle和一些DLL)。需要安装甲骨文,因为我的DLL依赖于..然后我会知道:) 发现与DependencyWalker的问题;) –

+0

不用担心,它为我节省了许多小时的头,很棒的小工具! :-) – display101

+0

+1给Keith Halligan建议DependencyWalker。它告诉我,并非所有的依赖都具有相同的CPU类型(x86/x64)。我将所有具有相同CPU类型的文件复制到我的应用程序的bin文件夹中,并解决了问题。 – DiligentKarma

2

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

28

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

dumpbin /DEPENDENTS my.dll 

这会告诉你哪些dll你的DLL需要加载。特别注意MSVCR * .dll。我没有看到正确的Visual C++ Redistributable未安装时发生错误代码。

您可以从Microsoft网站获得“Visual Studio 2013的Visual C++可再发行组件包”。它安装C:\ WINDOWS \ SYSTEM32 \ MSVCR120.dll

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

要小心,你有正确的Visual Studio版本(10.0 = VS 10,11 = VS 2012,12.0 = VS 2013 ...)适合您的DLL目标平台的正确体系结构(x64或x86),并且还需要注意调试构建。 DLL的调试版本取决于MSVCR120d.dll,它是库的调试版本,它随Visual Studio一起安装,但不是由可再发行组件包安装。

+4

添加VS C++可再分发版本对我来说是!需要v10.0(2010)。感谢mucho! –

+0

有什么方法可以判断是否需要64位或32位版本的可再发行组件? – BVB

+1

dumpbin/ALL会告诉你my.dll是不是x64的x86 –

2

确保您构建平台目标设置为x86或x64,以便它与您的DLL兼容 - 那可能是为32位平台进行编译。

2

如果DLL和.NET项目在同一个解决方案,并要编译和运行都每一次,你可以右键单击.NET项目的属性,构建事件,然后添加类似以下内容生成后事件命令行:

copy $(SolutionDir)Debug\MyOwn.dll . 

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

0

我认为你的非托管库需要一个清单。
Here是如何将它添加到你的二进制文件。和here是原因。

总之,可以在您的盒子中安装多个可重新发布的库版本,但只有其中一个应该满足您的应用程序,并且它可能不是默认的,因此您需要告诉系统您的库需要的版本,这就是为什么清单。

2

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

我加入InstalledSheild “Visual Studio的C++ 11.0 DebugCRT(x86)的” 合并模块和它的工作。希望这会对其他人有所帮助。

7

该DLL必须位于bin文件夹中。

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

1

设置:32位Windows 7

语境:安装了PCI-GPIB驱动程序,我无法通过通信由于上述问题。

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

龙回答: 我也用Dependency Walker,其中确定了几个缺少相关模块。马上,我认为它一定是一个拙劣的驱动程序安装。我不想检查和恢复每个丢失的文件。

,我是无法找到下程序和控制面板的功能卸载事实是错误的安装的另一个指标。我必须手动删除\ system32和注册表项中的几个* .dll以允许重新安装驱动程序。

问题修复。

意想不到的部分是,并非所有的依赖模块都解决了。尽管如此,现在可以引用* .dll的利益。

3

有一个很有趣的事情(和具有技术相关性),这可能会浪费你的时间,从而想到这里分享它 -

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

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

我一直得到了几个小时的

Unable to load DLL

错误。后来我意识到,所有这些未加管理的组件都需要被复制到启动项目ConsoleApplication1\bin\debug目录中,该目录通常是获胜形式,控制台或Web应用程序。

所以请谨慎接受答案中的Current Directory实际上代表主应用程序的Current Directory,从您的应用程序进程开始。看起来像是一件显而易见的事情,但有时候可能并非如此。

获悉的课程 - 始终将未管理的dll放置在与启动可执行文件相同的目录中以确保可以找到它。

+0

这也固定了我的东西。感觉有点奇怪把DLL的主要项目,而不是实际使用它们的项目,虽然... –

2

这是一个“杂牌” 你至少可以用它来执行有效性测试: 尝试硬编码的路径,DLL在你的代码

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

这样说;在我的情况下,按照@ anthony-hayward的建议运行dumpbin /DEPENDENTS,并将32位的DLL版本复制到我的工作目录中,以解决此问题。

的消息只是一个有点误导,原因是其是不是“我的” DLL不能加载 - 它是依赖

1

我也碰到过同样的问题,在我来说,我有两个32 bit pcs。 一个安装了.NET4.5,另一个是新的PC。

我的32位CPP DLL(Release模式构建)工作正常使用.NET安装的PC,但不与新鲜PC在那里我得到下面的错误

Unable to load DLL 'PrinterSettings.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

最后,

I just built my project in Debug mode configuration and this time my cpp dll was working fine.

+0

为我工作!谢谢 – SaddamBinSyed

相关问题