Net dll組件版本相容問題

來源:互聯網
上載者:User

標籤:文章   生產   sch   ssl   2.0.8   rar   根據   span   asm   

dll組件版本相容問題,是生產開發中經常遇到的問題,常見組件相容問題如:Newtonsoft.Json,log4net等

為了節約大家時間,想直接看解決方案的,可直接點擊目錄3、4

目錄

1.版本相容問題的原因

2.解決版本相容前提

3.指定特定版本bindingRedirect**

4.指定某檔案夾中的特定版本codeBase**

 

版本相容問題的原因

首先讓我們簡單瞭解下程式引用的原理:

當運行庫試圖解析對另一個程式集的引用時,就開始進行定位並綁定到程式集的進程。詳細見:運行庫如何定位程式集

步驟如下:

  • 第 1 步:檢查設定檔(.config檔案)
  • 第 2 步:檢查以前引用的程式集
  • 第 3 步:檢查全域組件快取
  • 第 4 步:通過基本代碼或探測定位程式集
解決版本相容前提

簡單瞭解原理以後,常見解決相容的方法

1. 首先瞭解你要用那個dll,具體版本是什麼,查看版本方法:

1)檔案夾裡dll檔案,右鍵->屬性

2)解決方案裡引用的dll,右鍵->屬性

 

方法1、指定特定版本**

 利用config的bindingRedirect指向特定版本組件

.config添加節點

<configuration><runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /><bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" /></dependentAssembly></assemblyBinding></runtime></configuration>

 解釋:

項目中所有項目、類庫引用0~10的Newtonsoft.Json版本,最終都指向到10這個版本

經驗:

1、各版本之間是有代碼變化的,如果一個類庫用了某個組件10.0的A10方法,結果指向的8.0,8.0很有可能還沒有A10這個方法,自然項目中用到A10的地方會報錯。調試和查錯誤比較麻煩,編譯器會根據bin下面的dll版本與代碼來匹配調用方法和屬性提示錯誤,或者不提示錯誤。

2、代碼可控的地方,儘可能的將版本更新中的廢棄方法改成高版本的替代方法。

3、一般高版本多數是相容低版本的方法,指向高版本報錯幾率小些,當然也有特殊情況。

方法2、指定某檔案夾中的特定版本

方法一能解決很多項目中出現的版本問題,但是有時候還是會遇到比較奇怪的相容問題。

例如:log4net和Memcached.ClientLibrary中的log4net衝突的問題,本文以解決這一版本衝突問題為例介紹此方法的使用方法。

如果想直接看結果,請點擊解決方案

為啥會出現log4net版本相容問題呢?

常見的組件是以name(名稱)、version(版本)、publicKeyToken(公開金鑰)三個組成,原因主要是由於log4net version 1.2.11與1.2.10的publicKeyToken不同所致。

可利用VS工具SN -T 組件檔案名稱.dll查看公開金鑰。

log4net (≥ 1.2.11) 公開金鑰標記為 669e0ddf0bb1aa2a

log4net (= 1.2.10) 公開金鑰標記為 1b44e1d426115821

看log4net在發展過程中改過一次身份證,又有好多老版本的組件引用了log4net的低版本導致與高版本相容問題

 log4net版本相容問題的範例 1、建立項目,引用Memcached組件

WebApp為項目應用程式層,ClassLibrary為工具類庫,WebApp引用ClassLibrary項目,ClassLibrary通過nuget引入Memcached.ClientLibrary 1.0組件。

ClassLibrary建立類Testing.cs代碼如下:

    public class Testing    {        public static void Init()        {            MemcachedClient mc = new MemcachedClient();        }    }

 WebApp建立測試頁面,測試代碼如下:

Testing.Init();

2、應用程式層,引用高版本log4net

WebApp引用log4net 2.0.8

 最終項目情況是:

 3、運行結果

查看WebApp的bin檔案夾下面的log4net版本是2.0.8,而Memcached.ClientLibrary組件用的log4net是1.2.10.0版本,所以報錯了。

注意

如果單獨編譯WebApp,bin下面是版本是2.8.0,如果單獨編譯ClassLibrary類庫,bin下面版本是1.2.10.0

 

處理log4net版本相容問題

1、bin下面添加log4net1.2.10.0檔案夾,並將log4net.dll版本為1.2.10.0放入到檔案夾中,可重新命名為log4net1.2.10.0.dll。

2、config添加

  <runtime>    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">      <dependentAssembly>        <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />        <codeBase version="1.2.10.0" href="bin/log4net1.2.10.0/log4net1.2.10.0.dll" />      </dependentAssembly>      <dependentAssembly>        <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />        <bindingRedirect oldVersion="0.0.0.0-2.0.8.0" newVersion="2.0.8.0" />      </dependentAssembly>    </assemblyBinding>  </runtime>

 3、結果如下

經驗:

1、檔案需要放在bin下面,並單獨建立個檔案夾,注意:若不建立檔案夾,直接將重新命名的log4net1.2.10.0.dll扔到bin下會報錯,應該是探測方法是根據name尋找的。

2、ClassLibrary類庫在單獨編譯的時候,會將高版本的替換成低版本,會有可能報錯,可以在開發中將其產生的dll不複製到bin下,設定是在引用的dll下右鍵,複製本地設定為false,操作如下:

3、為了能把log4net1.2.10.0.dll上傳到gitlab上面,可以在WebApp建立個相應檔案夾,並設定複製到輸出目錄-始終複製,vs編譯時間會自動將log4net1.2.10.0/log4net1.2.10.0.dll複製到bin下面

總結

 希望通過此文章,協助更多的人解決NET組件的版本相容問題。

參考文章

https://www.cnblogs.com/shijun/p/3713830.html

6183353

https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-3.5/6bs4szyc(v%3dvs.90)

https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2008/yx7xezcf(v=vs.90)


文章和觀點,有可能因為知識和閱曆的原因,分析片面,請多諒解。

 

 

Net dll組件版本相容問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.