2013-11-20 51 views
3

我試圖通過USB自帶一個需要被.NET C#類包裝的本機DLL附帶的CAN設備(供應商提供的源代碼)被包括在一個人的項目中。他們的示例應用程序針對.NET 2.0,其中我的應用程序面向.NET 4.0我能在他們的示例應用程序和調試都使用代碼就好了,但是,當我嘗試調試應用程序,我得到一個BadImageFormatException:當在.NET 4.0中加載本機DLL時發生BadImageFormatException

System.TypeInitializationException: The type initializer for 'TotalPhase.KomodoApi' threw an exception. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B) 

他們的代碼之間唯一的區別和我似乎因爲他們的代碼是爲.NET 2.0構建的應用程序,並且(目前)我的代碼正在作爲.NET 4.0中的MSTest單元測試運行。這兩種解決方案都針對AnyCPU。我正在運行Windows 7旗艦版64位安裝。即使從AnyCPU更改爲x86也沒有任何區別。我怎樣才能讓這個本地DLL加載到AnyCPU項目中?

+0

你有沒有試過將他們的應用程序重新定位到.Net 4.0?你能展示你如何與原生DLL進行互動嗎? – vossad01

+1

本機dll編譯的目標平臺是什麼? x64或x32?你可以使用依賴來找出。或DumpBin/Headers xxx.dll –

+0

+1爲DumpBin的建議,這有所幫助。我錯誤地從他們的SDK中選擇了錯誤的DLL。當我打算使用32位DLL時,我複製了64位DLL。該程序需要在32位客戶端上運行。 –

回答

8

如果在與本機DLL接口時得到BadImageFormatException,它幾乎總是意味着您嘗試在64位CLR中運行時嘗試與32位DLL進行對接,反之亦然。

當您運行示例應用程序時,是否在任務管理器的「進程」選項卡的「映像名稱」列中有進程*32?這表明應用程序正在32位CLR中運行。檢查你自己的應用程序。您正在測試的計算機可能只有32位.NET 2.0運行時,但可能是32位和64位.NET 4.0運行時,或者相反。

如果您正在使用.NET應用程序分發本機DLL,則應該將啓動項目設置爲x86或x64(與AnyCPU相對),具體取決於本機庫是32位還是64位。您始終可以發佈32位和64位版本,並讓安裝程序根據客戶端體系結構選擇要安裝的二進制文件。

或者,您可以發佈具有不同文件名的32位和64位DLL,爲每個版本定義單獨的P/Invoke存根,並決定在運行時調用哪一個。執行此操作的最簡單方法可能是將本機調用包裝在界面中(例如,INativeMethods),並根據IntPtr.Size選擇要在運行時實例化的實現。使用這種方法,您仍可以定位AnyCPU。

相關問題