内容简介:過去寫過不少 .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 為主,三不五時要處理版本茶包)
- 組件繫結重新導向功能的實地觀察--以ODP.NET為例
- 【茶包射手日記】ASP.NET子網站發生ODP.NET版本衝突
- 組件繫結重新導向鬼問題-版號高低之謎
- 【茶包射手日記】ASP.NET網站bindingRedirect無效
- ASP.NET /bin 組件載入跟你想的不一樣
有這麼多經驗撐腰,我自以為是組件繫結導向老手,可以搞定各種狀況... 直到我膝蓋中了兩箭。
在 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.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 【茶包射手日記】加裝不同 Oracle Client 版本後 ODP.NET 程式異常
- Unity实例开发-太空射手
- 【茶包射手日記】憑證儲存區的選擇
- 【茶包射手日記】SQLPlus Script 檔編碼問題
- 【茶包射手日記】IIS 每天早上無法登入疑案
- 【茶包射手日記】怪異的虛擬記憶體不足錯誤
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数字时代的营销战略
曹虎、王赛、乔林、【美】艾拉·考夫曼 / 机械工业出版社 / 2017-1 / 99.00元
菲利普•科特勒说,市场比市场营销变得更快(Market changes faster than Marketing),在这个变革的时代,从硅谷、波士顿到北京、上海、深圳,我们正在重新定义公司,重新定义组织,重新定义战略;同样地,营销亦需要重新定义。 从本质上讲,营销战略只有两个时代:实体时代与比特时代,也可称为工业时代与数字时代。从5年前开始,第二个时代正在向未来20年展开画卷,数字创新型企......一起来看看 《数字时代的营销战略》 这本书的介绍吧!