System.BadImageFormatException: 未能載入檔案或組件 "XXX" 或其相依性之一。嘗試載入格式不正確的程式。
典型場景:64 位元作業系統(Win7/Server 2008 R2+)部署 32 位元編譯的 .NET 應用程式至 IIS 7/7.5/8.x。
應用程式集合區預設以 64 位元模式執行,嘗試載入 32 位元組件(或呼叫 32 位元非託管 DLL),導致位元寬度不匹配。
優點:單一建構輸出可在 32/64 位元環境正確執行,無需調整 IIS 設定。
優點:不修改程式碼即可相容舊版 32 位元組件;缺點:該集合區內所有應用強制 32 位元模式,可能影響 64 位元原生應用效能。
若上述方案無效,啟用 Fusion Log:
reg add HKLM\Software\Microsoft\Fusion /v EnableLog /t REG_DWORD /d 1
reg add HKLM\Software\Microsoft\Fusion /v LogFailures /t REG_DWORD /d 1
reg add HKLM\Software\Microsoft\Fusion /v LogPath /t REG_SZ /d C:\FusionLogs\
重現錯誤後查看 C:\FusionLogs\ 詳細繫結失敗堆疊,精準定位缺失組件與版本衝突。
| 場景 | 建議策略 |
|---|---|
| 新專案/可重建 | 方案一:Any CPU + Prefer 32-bit |
| 舊版元件/無原始碼 | 方案二:獨立 32-bit 集合區隔離部署 |
| 混合 32/64 位元相依 | 拆分集合區,各自設定位元模式 |
| 生產環境變更 | 藍綠部署/金絲雀釋出,驗證無誤再切流量 |
「BadImageFormatException」本質是位元寬度不匹配。優先從編譯端解決(Any CPU),次之隔離集合區(Enable 32-Bit),避免全站降級為 32 位元模式。配合 Fusion Log 可快速定位深層相依性地雷。