【茶包射手日記】組件版本導向 bindingRedirect 注意事項兩則

栏目: ASP.NET · 发布时间: 4年前

内容简介:過去寫過不少 .NET 版本導向的文章,主要處理 ODP.NET 版本相容累積的經驗: (題外話:學會Managed ODP.NET 後前途有光明一點,但許多老專案仍以 ODP.NET 為主,三不五時要處理版本茶包)有這麼多經驗撐腰,我自以為是組件繫結導向老手,可以搞定各種狀況... 直到我膝蓋中了兩箭。在 A 網站做了元件調整,其中需要將 ODP.NET 9207 導向 2.112.1,看了一下 web.config,有加組件繫組導向沒錯: (網站是 ASP.NET 3.5,故加了 MSAJAX Syst

過去寫過不少 .NET 版本導向的文章,主要處理 ODP.NET 版本相容累積的經驗: (題外話:學會Managed ODP.NET 後前途有光明一點,但許多老專案仍以 ODP.NET 為主,三不五時要處理版本茶包)

有這麼多經驗撐腰,我自以為是組件繫結導向老手,可以搞定各種狀況... 直到我膝蓋中了兩箭。

在 A 網站做了元件調整,其中需要將 ODP.NET 9207 導向 2.112.1,看了一下 web.config,有加組件繫組導向沒錯: (網站是 ASP.NET 3.5,故加了 MSAJAX System.Web.Extensions 導向內建版本的導向設定)

<runtime>
    <assemblyBinding>
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
        <bindingRedirect oldVersion="0.0.0.0-9.9.9.9" newVersion="2.112.4.0"/>
      </dependentAssembly>
    </assemblyBinding>
    <assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

但實際執行卻會拋出找不到 ODP.NET 9207 的錯誤訊息,同樣做法在另一台測試主機上卻完全沒問題。

比對再比對,測試再測試(我寫了一個 ChkOdpNetVer.aspx 快速檢查,附於下),發現問題出在 runtime 下有兩段 asseblyBinding,ODP.NET 導向所在的第一段少了 xmlns="urn:schemas-microsoft-com:asm.v1",補上導向才會生效。

<%@ Page Language="C#" %>

<script runat="server">
    void Page_Load(object sender, EventArgs e) 
    {
        Response.Write(
            typeof(Oracle.DataAccess.Client.OracleConnection).Assembly.CodeBase);
        Response.End();
    }
</script>

爬到官方文件 - Redirecting Assembly Versions ,本草綱目有記確,assemblyBinding 的 xmlns 必須指定為 urn:schemas-microsoft-com:asm.v1。

> To bind an assembly, you must specify the string "urn:schemas-microsoft-com:asm.v1" with the xmlns attribute in the <assemblyBinding> tag.

文章寫好還沒發文,再接獲同事報案,某專案冒出「無法載入檔案或組件'log4net, Version=1.2.10.23127,Culture=neutral,PublicKeyToken=null'或其相依性的其中之一。找到的組件資訊清單定義與組件參考不符。(發生例外狀況於HRESULT: 0x80131040)」,原因是有元件參照了舊版 log4net,但專案由 NuGet 安裝了新版 2.0.8.0,web.config 有設 bindingRedirect,但顯然沒生效。

<dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" curture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-2.0.8.0" newVersion="2.0.8.0"/>
      </dependentAssembly>

注意到錯誤訊息 publicKeyToken="null",非強式名稱(Strong Name)組件,而試著將 assemblyIdentity 的 publicKeyToken 改為 null,也沒生效。 最後查到一篇 Stackoverflow 相關討論 ,提到官方文件有說:

Note You cannot redirect versions for assemblies that are not strong-named. The common language runtime ignores the version for assemblies that are not strong-named.

查詢結果,在 .NET 1.1 版 還保留有此一說明,但新版文件已移除,是否某個版本起行為有改不得而知。總之,這次實測結果是我們無法將 publicKeyToken="null" 的 log4net 組件導向新版。

又學了一課,未來遇 bindingRedirect 無效時,先檢查:1. assemblyBinding 的 xmlns="urn:schemas-microsoft-com:asm.v1" 有沒有加? 2. web.config 如果有 <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> ,要將 xmlns 拿掉。參考 3. 是否非強式名稱組件(publicKeyToken="null")。

Cases of failed .NET assembly binding redirection caused by missing xmlns attribute and non strong name assembly.


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

jQuery 技术内幕

jQuery 技术内幕

高云 / 机械工业出版社 / 2014-1-1 / 99元

本书首先通过“总体架构”梳理了各个模块的分类、功能和依赖关系,让大家对jQuery的工作原理有大致的印象;进而通过“构造 jQuery 对象”章节分析了构造函数 jQuery() 的各种用法和内部构造过程;接着详细分析了底层支持模块的源码实现,包括:选择器 Sizzle、异步队列 Deferred、数据缓存 Data、队列 Queue、浏览器功能测试 Support;最后详细分析了功能模块的源码实......一起来看看 《jQuery 技术内幕》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具