【茶包射手日記】aspnet_compiler的ODP.NET參照版本問題
0 |
案情如下:
公司有台CruiseControl.NET伺服器,負責ASP.NET Web Site網站的自動化建置及部署。最近因部分專案將使用EF for Oracle,新裝ODAC 11.2.0.3,然而部分仍使用ODP.NET 2.112.1版的專案,建置後出現App_Code.dll參照2.112.3版,其他資料夾Build的DLL卻參照2.112.1版的狀況,部署到正式主機時便會因該主機尚未安裝2.112.3版導致錯誤。
檢視建置所得的DLL,證實確有兩種版本並存情況:
App_Code參考2.112.3
HS0101.dll參考2.112.1
由Log找到Build Server使用的aspnet_compiler.exe指令,手動執行發現aspnet_compiler偵測到版本衝突並曾提出警告:
D:\Test\src>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -v ./2010Web -p D:\test\src\2010Web -u -f -d d:\test\TempBuildDir Utility to precompile an ASP.NET application Copyright (C) Microsoft Corporation. All rights reserved. (0): warning CS1702: Assuming assembly reference 'Oracle.DataAccess, Version=2.1 12.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342' matches 'Oracle.DataAc cess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342', you may need to supply runtime policy
檢查web.config,其指定ODP.NET版本為2.112.1.0無誤:
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
... 略 ....
<add assembly="Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89B483F429C47342"/>
</assemblies>
會被導向2.112.3,推測是安裝新版ODAC後,GAC被放入發行者原則Publisher Policy強制導向的緣故:
試著在web.config中加上組件繫結導向設定,將2.112.3再導回2.112.1:
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<bindingRedirect oldVersion="2.112.1.0-2.112.3.0" newVersion="2.112.1.0"/>
</dependentAssembly>
測試無效,此舉並未能阻止導向2.112.3。研判發行者原則的效力優先於web.config設定,查詢MSDN文件,找到護身符<publisherPolicy apply="no" />一枚,可形成結界忽略發行者原則,web.config再調整如下:
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342"/>
<bindingRedirect oldVersion="2.112.1.0-2.112.3.0" newVersion="2.112.1.0"/>
<publisherPolicy apply="no"/>
</dependentAssembly>
經以上修改,aspnet_compiler編譯時即不再出現Oracle.DataAccess版本警示,編譯結果也一致指向2.112.1,問題排除~
Comments
Be the first to post a comment