Oracle Client 10.2.0.1で稼働していたシステムを、Windows7対応により、10.2.0.5へバージョンアップをします。
まず、OracleClient10.2.0.1がインストールされている環境で作成したモジュールを、
10.2.0.5環境で動かすと、例外エラーが出ます。
【エラー内容】
ファイルまたはアセンブリ 'Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
これは、side-by-side実行 という.netの標準動作であり、
ビルドした時に使用したモジュールのバージョンを実行時のも保持している事が理由で
このエラーは、ビルド時のモジュールがないからと発生するものです。
詳しくは、@ITあたりで。
http://www.atmarkit.co.jp/fdotnet/technology/idnfw11_04/idnfw11_04_01.html
対処法の1つとして、bindingRedirectという仕組みがあります。
簡単に言うと、バージョンをリダイレクトし、異なるバージョンへ飛ばすものです。
これで、該当モジュールが存在しないときに、別のバージョンを参照することができます。
設定は、app.configに記載する必要があります。
【記載例】
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
<bindingRedirect oldVersion="10.2.0.000-10.2.0.999" newVersion="1.102.2.20"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
ここで、「ん?」と思ったかもしれませんが、
ODP.netのバージョン番号の付与方法は、ODP10.2.0.3以降より、大幅に変わっています。
簡単に言うと、10.2.0.2までは、ODP.netのバージョンとほぼ同等。
それ以降は、先頭にFrameworkのバージョン番号が付くようになります。
アセンブリはバージョンアップしているにもかかわらず、バージョン番号は下がっているようにみえる。
一瞬混乱しますが、bindingRedirectの仕組みは、バージョンダウンにも対応可能。
よって、本方法で動作します。
それじゃなければ、汎用的なbindingRedirectの記述方法で簡単に参照できるそうです。(未検証)
【追記】
別アプローチとして「発行者ポリシー」を作成する等方法があります。
これは、GACに対してBindingRedirectを設定されるようなイメージですが、
アプリを改修せずに実施できるので、選択肢として検討するのもいいかもしれません。
0 件のコメント:
コメントを投稿