読者です 読者をやめる 読者になる 読者になる

misc.log

日常茶飯事とお仕事と

ODP.NETのバージョンでトラブル

業務日誌.NET 業務日誌 DB Oracle

以前、アセンブリバージョンリダイレクトについて書きました。これを使った環境で、なんかエラーが(笑)。
やりたかったことは

  • ODP.NET 2.102.5.0で作成したプログラムを、ODP.NET 2.102.4.0だけが入った環境で動かしたい

ということでした。通常、古いバージョンで作ったモノを新バージョン環境で新バージョンライブラリを使うように指示するのがアセンブリバージョンリダイレクトなのですが、ここでは「http://d.hatena.ne.jp/frontline/20120717/p1」にあるように、逆のことをやろうとしています。あえてこんなことをやる理由は、導入先の環境構成上、どうしても古い環境が残ってしまうためという政治的理由によるものです。

で、単独のプログラムであればこれで特に問題が無さそうだったのですが、今回のシステムでは

  1. ODP.NETを使った共通ライブラリDLL
  2. ODP.NETと上記共通ライブラリDLLを使ったEXE

というような構成でソースが組まれています。そのときに、上記(2)のソースでビルド後にこんな警告がでるようになりました。

同じ依存アセンブリの異なるバージョン間での競合が見つかりました。

警告メッセージをダブルクリックすると、

1つ以上の依存アセンブリバージョンが競合しています。
app.configファイルにバインドリダイレクトレコードを追加してこの競合を修正しますか?

と表示され、「はい」を押すとapp.configに「バージョン 0.0.0.0〜2.102.5.0までの参照は、2.102.5.0にリダイレクト」という設定が追記され、警告が消えます。
追記後のapp.configは以下の通り。

<?xml version="1.0"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
          <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342"/>
          <bindingRedirect oldVersion="2.102.5.0" newVersion="2.102.4.0"/>
       </dependentAssembly>
       <dependentAssembly>
	    <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral"/>
	    <bindingRedirect oldVersion="0.0.0.0-2.102.5.0" newVersion="2.102.5.0"/>
       </dependentAssembly>
  </assemblyBinding>
  </runtime>
</configuration>

ん−……でもこれじゃ……「2.102.5.0 → 2.102.4.0 →(〜4.0は5.0未満だから)2.102.5.0」と循環してしまうのでは??……と思ったのですが、たとえば、2.102.4.0 しか入っていない環境でも問題無く動きました。

GACに古いOracle.DataAccessが残ってる……

気になったので開発環境のGACを見てみたところ、こんなことになっていました。

Version 2.102.2.20が残ってるの?もしかしてこれと衝突してる??環境のインストールミス??なんだかもうよくわからない。ちなみに、この2.102.2.20 をGACのアセンブリ一覧からアンインストールしても、冒頭に書いた警告は消えませんでした。参照しているライブラリの何か、どれかが古いものを参照しているとかだとおもうのですが、既存システムのややこしいソースの中なのでちょっと判らない。……別にビルドは通ってるからいいんだけど、気持ち悪い。

もしかして:app.configってビルド時にも見られてるの??

もしかして、ビルド時に「2.102.5.0だから、〜4.0にリダイレクト」が発生しているとか?ところが、参照しているDLL(これらもODP.NETを利用している)は2.102.5.0指定で作成されているから、参照バージョンが違うと。で、Visual Studioの指示通りにapp.configに追加した記述は「バージョンゼロ〜2.102.5.0がきたら、2.102.5.0にしろ」ってことで、循環して参照が戻ってる??

ちょっと判らないし調べてる時間も無いので、警告を消す方法(app.configへの自動追記)はとりあえず使える、ということで一旦放置。