2012-09-18 66 views
2

當我使用VS2008來構建我的項目時,我使用我自己的DLL。它的工作原理沒事在release模式,但是當我將其更改爲debug模式,我得到一個錯誤:調試模式下的DLL加載錯誤,但發佈模式正常

An unhandled exception of type 'System.DllNotFoundException' occurred in DDKWidget.exe

信息Unable to load the DLL "DDKLibA.dll": The specified module could not be found.

DDKWidgetDDKLibA.dll是我的項目excutable文件和我自己創建的DLL。 我在C++中創建了我的DLL,但我在我的C#項目中使用我的項目,使用[DllImport("DDKLibA.dll")]

我的OSWin7 64 bit
我的IDEVS2008 SP1

有沒有人遇到過這個?
順便說一句,前段時間一切都好,但最近,因爲我重新安裝我的OS,我開始得到這些錯誤。誰能幫我?

回答

0

其中在文件系統中的DLL位於?也許你將它複製到與你的發佈exe文件相同的目錄中,但忘記爲debug exe文件做同樣的事情?

+0

我已經解決了我的問題。 我想要注意的第一件事是,當使用系統DLL時,請檢查它是32位還是64位,它們是不同的。 第二件事是解決我的問題的關鍵是,當我把缺少的DLL到system32文件夾,我必須把一個副本到syswow64文件夾呢!這就是我所有需要糾正的問題。 – user1679007

0

我唯一見過這種情況的發生是當某個依賴DLL丟失時。例如,程序集的發佈版本依賴於foo.dll,但調試版本依賴於foo-debug.dll。如果目標系統上未安裝foo-debug.dll,則無法加載程序集的調試版本。

我建議你使用文件監視實用程序(如FileMon)來查看加載DLL時操作系統試圖加載哪些文件。

+0

我使用[依賴walker]發現我錯過了兩個模塊,但是當我下載它並將它們放到system32文件夾時,依賴項有兩個錯誤:錯誤:至少有一個模塊由於缺少導出函數而導致未解析的導入在隱式依賴模塊中。 錯誤:找到具有不同CPU類型的模塊。 – user1679007

0

這聽起來像是一個64位與32位不匹配的問題。默認情況下,CLR應用程序將被編譯爲「AnyCPU」,這意味着它們將在64位操作系統上自動運行爲64位進程。

另一方面,C++ dll必須編譯爲32位或64位,一旦編譯,他們保持這種方式。

即使在64位操作系統下,您也可以強制C#應用程序以32位模式運行,但可以獨立更改調試和發佈配置的設置。

我的猜測是你的C++ dll編譯爲32位,而你的C#dll的調試設置也是32位,但是在Release模式下它被設置爲AnyCPU。這樣它將以64位進程運行,並且無法加載32位C++ dll。

+0

這正是你說的。我的DLL是建立在32位,但是當我使用depends.exe檢查我的DLL,它有另外兩個錯誤。錯誤:至少有一個模塊有一個未解決的導入由於在隱式依賴模塊中缺少導出功能。 錯誤:找到具有不同CPU類型的模塊。 – user1679007

+0

它在發佈模式下運行良好,但在調試模式下出錯。 – user1679007

+0

我已經解決了我的問題。 我想要注意的第一件事是,當使用系統DLL時,請檢查它是32位還是64位,它們是不同的。 第二件事是解決我的問題的關鍵是,當我把缺少的DLL到system32文件夾,我必須把一個副本到syswow64文件夾呢!這就是我所有需要糾正的問題。 – user1679007

相關問題