System.BadImageFormatException: 無法載入檔案或組件 "XXX" 或其相依性之一。
嘗試載入格式不正確的程式。
核心原因:**進程位元數(32/64-bit)與被載入組件的目標平台不一致**。
| 作業系統 | IIS 應用程式集區 | 專案建議平台 | 說明 |
|---|---|---|---|
| 64-bit (Win7/Server 2008 R2+) | 啟用 32-bit = false (預設) | Any CPU (Prefer 32-bit 未勾選) | 進程為 64-bit,Any CPU 會以 64-bit JIT |
| 64-bit | 啟用 32-bit = true | x86 | 進程強制 32-bit,專案必須標記 x86 |
| 32-bit (XP/Server 2003) | 僅 32-bit | Any CPU 或 x86 | 皆以 32-bit 執行 |
Any CPU(未勾 Prefer 32-bit)→ 64-bit OS 上跑 64-bit,32-bit OS 上跑 32-bit。x86 → 強制 32-bit,適合需載入 32-bit COM/.native DLL 的情境。x64 → 強制 64-bit,較少用(除非明確需 64-bit 指令集)。現象:64-bit IIS 載入失敗。
方案 A(推薦):專案設為 x86,整個進程以 32-bit 執行。
方案 B:IIS 應用程式集區 → Advanced Settings → Enable 32-Bit Applications = True,專案維持 Any CPU (Prefer 32-bit)。
原因:Prefer 32-bit 勾選時,Any CPU 會在 64-bit OS 上以 **32-bit** JIT,但若 IIS 集區 Enable 32-Bit Applications = False,進程為 64-bit,載入 32-bit 組件失敗。
修正:取消勾選 Prefer 32-bit,或開啟集區 32-bit 相容模式。
專案必須設為 x64 或 Any CPU (Prefer 32-bit = false),且 IIS 集區 Enable 32-Bit Applications = False。
CorFlags.exe MyAssembly.dll
// 輸出範例
Version : v4.0.30319
CLR Header: 4.0
PE : PE32
CorFlags : 0x3
ILONLY : 1
32BITREQ : 1 ← 1 表示強制 32-bit (x86)
32BITPREF : 0 ← 1 表示 Prefer 32-bit
Signed : 0
32BITREQ=1 → x8632BITREQ=0, 32BITPREF=1 → Any CPU (Prefer 32-bit)32BITREQ=0, 32BITPREF=0, PE=PE32+ → x64若專案採用插件架構,不同插件可能針對不同平台編譯。建議:
bin\x86\,64-bit 插件放入 bin\x64\。App.config 設定 <probing privatePath="x86;x64" />,執行時由 CLR 依進程位元數自動載入正確資料夾。CorFlags 或 dumpbin /headers 驗證其位元數。依循上述原則,即可徹底根治 BadImageFormatException,實現跨平台穩定部署。