2011-07-25 12 views
0

我已經繼承了一個unamanged DLL(最初由C代碼構建)並希望在.NET中使用它項目。我有頭文件將DLL的功能封裝在一個C++類型的對象中,這是我想要公開的面向對象的功能。當我將這些頭文件包含在一個標準的C++(Win32)項目和一個C++/CLI項目中,引用原始DLL時,一切正常。CLI/C++ DLL封裝非託管DLL,在運行時崩潰在.NET中(ieshims.dll和gpsvc.dll缺失)

使用Visual C++ Express 2010,我試圖爲.NET構建一個託管的DLL。由於依賴性問題,此DLL在運行時崩潰。依賴Walker說:

警告:至少找不到一個延遲加載依賴項模塊。

警告:由於延遲加載相關模塊中缺少導出功能,至少有一個模塊具有未解析的導入。

並抱怨說它無法找到gpsvc.dll或ieshims.dll。我知道這與x86與x64(我在x64上運行Win7)有關,但是,因爲我可以在C++項目中使用我的系統上的DLL,所以我懷疑它必須可以包含在託管DLL中以供使用在同一個系統上的.NET。

非常感謝任何能提供任何見解的人! (順便說一句,我的目標是開發一個.NET程序集,而不是直接在原始DLL上使用p/invoke,因爲很多C/VB程序員會在我之後使用有限的互操作體驗)

+0

.NET項目中有關「平臺目標」的設置是什麼?請參閱C#項目設置中的「構建」選項卡。如果您的C++ DLL是爲32位構建的並且您在64位平臺上執行的,則「平臺目標」需要爲「x86」。不過,我懷疑這與你正在觀察的問題無關。 – Manfred

+0

平臺目標 - x86,允許不安全的代碼未被檢查,並檢查優化代碼。謝謝 – Rory

+0

請確保您使用的是32位版本的Dependency Walker。當它看到32位可執行文件時,該工具不夠聰明,無法使用32位庫搜索規則。 –

回答

0

解決方案:x86/x64問題是一個紅鯡魚。我有一個三維鏈長的依賴關係。所有引用的Visual Studio的'copy local'屬性設置爲true,所以我所引用的託管dll被複制到本地,遠離它的依賴關係。

出於某種原因,我無法弄清楚,將引用的複製本地屬性設置爲false並刪除它所做的本地副本不能解決問題。我必須將依賴關係複製到C#項目的本地bin。

一個潛在的外賣是付出太多關注未接電話時依賴於依賴學步車可能會導致你在錯誤的方向..

0

如你,羅裏,在你的答案中提到,解決方案似乎是您需要將所有依賴DLL包含在C#應用程序的References部分中/手動將所有DLL包含在C#bin或運行.exe的同一文件夾中。

我剛剛遇到了與您的設置類似的問題。我有以下依賴關係:

C# application -> (1) CLI Wrapper DLL -> (2) C++ Wrapper DLL -> (3) 3rd Party DLL

在引用部分,我包括(1)CLI DLL。我沒有包含(2)C++ DLL,因爲它引發錯誤ERROR ...could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component(解釋:C++ DLL不符合.NET/CLR)。

我然後簡單地認爲是因爲(1)CLI DLL正確地併成功地連接到(2)C++ DLL(I測試這與C++/CLI控制檯應用程序),C#應用程序將能夠通過引用的(1)CLI依賴關係訪問(2)C++依賴關係。這是不正確的。

我不知道爲什麼,但C#應用程序無法訪問CLI的依賴項。

我的解決方案是手動將(2)C++ DLL包含在.exe的目錄中。請記住,如果Local Copy在C#應用程序中設置爲true,則會自動複製(1)CLI DLL。 (2)C++ DLL引用(3)第三方DLL(即(3)第三方DLL可以駐留在其指定的路徑/不需要本地複製),我似乎沒有遇到任何問題。

相關問題