2010-05-28 160 views
3

我在Visual Studio中使用類庫項目在C++中創建了一個dll。我需要從C#應用程序調用dll中的方法。如何從C#窗口應用程序項目調用C++ dll

我知道有兩種方法。一種是將dll項目引用添加到C#項目或使用DllExport導出方法。但是,當我嘗試兩種方式時,它總是給運行時調用dll方法時出現以下錯誤。

TestClient.exe中發生未處理的類型爲'System.BadImageFormatException'的異常 附加信息:試圖加載格式不正確的程序。 (從HRESULT異常:0x8007000B)

我可以知道如何避免此問題?

在此先感謝!

+0

您發佈了結果(例外),但不是原因(您的源代碼)。 – 2010-05-28 10:45:39

回答

5

此錯誤意味着您正試圖將32位DLL加載到64位進程或64位DLL中加載到32位進程中。在Windows上,DLL的位數必須與進程的位數相匹配才能正確加載。

您的本地DLL是32位還是64位?在您的C#項目構建設置中,您定位的是哪個平臺?如果您進入C#項目屬性,您可以轉到「構建」選項卡並將「平臺目標」更改爲x86或x64等特定項目,以與您的本機DLL的平臺相匹配。

另一種方法是構建本機DLL以匹配C#應用程序的平臺。但是,如果C#應用程序的平臺是AnyCPU,則它將在32位Windows上運行爲32位,在64位Windows上運行爲64位。因此,您將需要本地DLL的32位和64位版本。

我建議您將C#應用程序的平臺設置爲特定的(x86,x64),然後更改您的本機DLL的平臺以匹配。

+0

我使用64位機器。但所有的項目都在32位平臺上,除了「Win 32」以外,我甚至無法更改C++ dll項目中的平臺目標。在C#項目屬性中,構建目標只能設置爲「任何CPU」。 但是我設法從C#web服務訪問dll方法。使用C#windows應用程序時遇到此問題。 – chathuradd 2010-05-28 11:29:44

+0

爲什麼不能從AnyCPU更改C#項目?它是一個什麼樣的項目? 64位機器上的AnyCPU項目將以64位運行。當它試圖加載你的Win32(32位)C++ DLL時,它會失敗,除了你看到的例外。您應該將C#項目更改爲x86或將C++ DLL項目更改爲x64。 – 2010-05-28 11:39:48

+0

對不起。我似乎看錯了地方。是的,我可以在C#中將平臺更改爲x86,因此現在不會引發異常。 非常感謝:) – chathuradd 2010-05-28 12:21:13

相關問題