錯誤信息
System.IO.FileLoadException: 未能加載文件或程序集 "c, Version=8.9.35.246...找到的程序集清單定義與程序集引用不匹配
核心原因
- 版本不匹配:引用的
a.dll 編譯時依賴 c.dll v8.9.35.246,運行時發現 c.dll 版本不同(如 GAC 中較舊版本、輸出目錄缺失、或被 Binding Redirect 重定向)。
- PublicKeyToken 不一致:強簽名程序集簽名密鑰不同。
- 架構不匹配:x86/x64/AnyCPU 混用。
排查步驟
- 檢查輸出目錄:
bin\Debug 下是否同時存在 a.dll、b.dll、c.dll,版本號一致。
- 啟用 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\ 詳細加載失敗原因。
- 用 ILSpy/Reflector 反編譯 a.dll,查看
.assembly extern c 記錄的具體版本、PublicKeyToken。
- 檢查 app.config/web.config 是否有
<assemblyBinding> 重定向導致版本不匹配。
- 清理 GAC:
gacutil /l c 查看全局緩存版本,必要時 gacutil /u c 移除舊版。
修復方案
| 場景 | 操作 |
| 輸出目錄缺失 c.dll | 設置 c.dll「複製到輸出目錄」=「如果較新則複製」 |
| 版本衝突 | 統一 NuGet 版本,或在 app.config 添加 bindingRedirect 到統一版本 |
| 強簽名密鑰不同 | 重新簽名所有程序集使用同一 .snk,或取消強簽名 |
| 架構不匹配 | 項目屬性 → Build → Platform target 統一為 x64 或 AnyCPU (Prefer 32-bit) |
最佳實踐
- 採用 NuGet 管理所有依賴,避免手動複製 DLL。
- 啟用
Copy Local = true 確保輸出目錄自包含。
- CI 流程中執行
dotnet build --verify-no-unresolved-refs 檢測缺失引用。