我已經繼承了一個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程序員會在我之後使用有限的互操作體驗)
.NET項目中有關「平臺目標」的設置是什麼?請參閱C#項目設置中的「構建」選項卡。如果您的C++ DLL是爲32位構建的並且您在64位平臺上執行的,則「平臺目標」需要爲「x86」。不過,我懷疑這與你正在觀察的問題無關。 – Manfred
平臺目標 - x86,允許不安全的代碼未被檢查,並檢查優化代碼。謝謝 – Rory
請確保您使用的是32位版本的Dependency Walker。當它看到32位可執行文件時,該工具不夠聰明,無法使用32位庫搜索規則。 –