有個網站專案,原本使用ODP.NET 9.2,在主機安裝ODP.NET 10.2後,出現了"ORA-12154: TNS: 無法解析指定的連線ID"錯誤,訊息很單純,一定因為新增ODP.NET 10.2後還沒設定NETWORK\ADMIN\TNSNAMES.ORA檔案的緣故。

不過,等一下! 網站專案元件用的是ODP.NET 9.2並沒有重新編譯,為什麼會自動改用ODP.NET 10.2呢? 原來這是.NET的組件繫結重新導向功能,意指我們可以透過以下三種方式之一強迫特定組件改用指定版本:

  • 在應用程式組態檔中加入設定
  • 在電腦組態檔中加入設定
  • 建立與元件一併散發的發行者原則檔,以指定元件所應使用的組件

ODP.NET 10.2採取的是第三種做法,我們在GAC中可找到線索:

在GAC中有兩個個Policy.9.2.Oracle.DataAccess,其中Version分別為9.2.0.700及10.2.0.100。試著找源頭,可發現c:\oracle\ora102\odp.net\PublisherPolicy\Policy.9.2.Oracle.DataAccess.config就是10.2.0.100 Policy.9.2.Oracle.DataAccess的來源,其內容如下:
<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
            <bindingRedirect oldVersion="9.2.0.000-9.2.0.999" newVersion="10.2.0.100"/>
        </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

其中指定將所有對9.2.0.0-9.2.0.999的參照都指向10.2.0.100,這就是安裝ODP.NET 10.2後,原本參照ODP.NET 9207的程式會自動改用10.2版的背後黑手囉!


Comments

Be the first to post a comment

Post a comment