首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

.NET 程序集依賴加載失敗:FileLoadException 排查全流程

     編輯:程式設計綜合問答

錯誤信息

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 混用。

排查步驟

  1. 檢查輸出目錄:bin\Debug 下是否同時存在 a.dll、b.dll、c.dll,版本號一致。
  2. 啟用 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\ 詳細加載失敗原因。
  3. 用 ILSpy/Reflector 反編譯 a.dll,查看 .assembly extern c 記錄的具體版本、PublicKeyToken。
  4. 檢查 app.config/web.config 是否有 <assemblyBinding> 重定向導致版本不匹配。
  5. 清理 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 檢測缺失引用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved