2012-01-25 140 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

相關問題