兩種原因:
第一種為程序的運行以平台系統位數不匹配,第二種則是該死的VS整出來的...
一般在下面三種情景下會發生.
1.64位系統上C#調用32位的C++ *.dll
2.64位系統上IIS發布含有32位的 *.dll應用程序時
3.64位系統上編寫C++ *.dll,在64位系統上通過 C#調用 ,可能成功,也可能失敗,失敗就報BadImageFormatException 異常,也是最二的一種情況.是由該死的VS整出來的
解決方法如下:
1.VS在64位系統下面,編譯調試某個C++的API的時候,報錯:未處理BadImageFormatException 試圖加載格式不正確的程序。 (異常來自 HRESULT:0x8007000B)
詳見下圖:
其原因是該API是在32位系統下面開發的,在64位系統上面開發編譯的時候需要將生成的目標平台設為X86。
方法是:
在右邊的“解決方案資源管理器”里,右鍵該項目點擊屬性。在屬性窗口里選擇“生成”——“目標平台”下拉里選中“X86"即可。見下圖:
然后保存重新編譯
原因:程序集之間的通訊要么全是64位環境下的,要么全是32位環境下的。不能混編訪問。不然會出現“試圖加載格式不正確的程序”的錯誤;
解決辦法是把發布網站的程序池開通32位兼容性即可,如下圖:
3.如果上面的沒有解決,那就是VS中C#工程的問題,打開對應的工程文件(*.csproj),如下圖<Prefer32Bit>false</Prefer32Bit>節點
下面是MSDN的解釋:
CSharpProjectConfigurationProperties6.Prefer32Bit 屬性
獲取或設置一個標志,指示是否首選的 32 位平台。
命名空間: VSLangProj110
程序集: VSLangProj110(在 VSLangProj110.dll 中)
C#
bool Prefer32Bit { get; set; }
屬性值
返回表示 32 位首選項的標志。 返回true如果 32 位是首選。 否則,返回false。