未能加載文件或程序集或它的某一個依賴項,系統找不到指定的文件


解決不同版本依賴問題

1. 問題描述

一個項目引用不同版本的同一DLL,會引發以下報錯:

未能加載文件或程序集“xxx, Version=x.x.x.x, Culture=neutral, PublicKeyToken=xxxxxxxxxxxx”或它的某一個依賴項。系統找不到指定的文件

這里來解決項目中同一DLL的多版本問題。

2. 解決方式

通過配置配置文件(app.config[控制台或窗體應用等]或web.config[Web項目])增加配置節點dependentAssembly

不同場景有不同的解決方式,下面說明

場景一、以高版本兼容

例如:新舊項目都引用Newtonsoft.Json,但是不同版本。需要以最高版本兼容時:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
  </appSettings>
  <system.web>
  </system.web>
  <system.webServer>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

場景二、同一DLL兩種版本共存

例如:項目自己引用log4net.dll 版本1.2.13.0 。添加第三方某個dll,第三方依賴log4net.dll版本1.2.9.0,項目中需要兩種版本共存。
這里還分兩種情況,DLL的publicKeyToken相同還是不同 (publicKeyToken查詢見說明)

  • publicKeyToken相同,配置方法:
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" />
      <codeBase version="1.2.13.0" href="bin\log4netdll\1_2_13\log4net.dll" />
      <codeBase version="1.2.9.0" href="bin\log4netdll\1_2_9\log4net.dll" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>
  • publicKeyToken不同,配置方法:
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" />
      <codeBase version="1.2.13.0" href="bin\log4netdll\1_2_13\log4net.dll" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="log4net" publicKeyToken="b32731d11ce58905" />
      <codeBase version="1.2.9.0" href="bin\log4netdll\1_2_9\log4net.dll" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

說明

  • publicKeyToken獲取方式

使用Visual Studio的Tools Command Prompt命令行工具,輸入:SN -T "path",例如:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC>SN -T D:\Newtonsoft.Json.dll

Microsoft(R) .NET Framework 強名稱實用工具 版本 4.0.30319.33440
版權所有(C) Microsoft Corporation。保留所有權利。

公鑰標記為 30ad4fe6b2a6aeed


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM