案情如下:

公司有台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

Post a comment