ODP.NETを利用している業務系アプリのWindows 8.1、Windows 10への対応作業中。(主に動作確認レベルですが)
アプリの導入手順としてOracle Clientをインストールしておけば動くはずなのですが、なぜか動きません。
原因はODP.NETがGAC(グローバルアセンブリキャッシュ)に登録されていないため。
ODP.NET(Oracle.DataAccess.dll)を静的参照している場合、それと分かるエラーメッセージなどが出ずにいきなり落ちてしまったりするので結構ハマりがち。
ちなみに少し面倒だけれどもリフレクションを使って動的参照の形で作るといきなり落ちるようなことは防げます。
.Net Frameworkのバージョンが2.0時代の古いアプリなので、Win8.1/10の場合、先にWindowsの機能に「.NET Framework 3.5(2.0)」を追加しておかないと、Oracle Clientのインストーラが.NET 2.0用のODP.NET DLLをGACに登録してくれません。
このような場合に後からGAC登録するには以下のコマンドを実行すれば良いとのこと。(パスは適宜編集してください)
1 2 |
> cd C:\app\Administrator\product\11.2.0\dbhome_1\ODP.NET\bin\2.x > oraprovcfg /action:gac /providerpath:C:\app\Administrator\product\11.2.0\dbhome_1\ODP.NET\bin\2.x\Oracle.DataAccess.dll |
Skylake問題などもあって、企業向けシステムのWindows 10対応が少し早まっているようです。
まぁ、そもそもWindows 7で動いていれば普通に動きそうなものなのですが、High DPIなどの対応まで考慮するとそのままでは厳しい部分もあったりなかったり。
■追記 2018-06-20
かれこれ2年以上経過しているエントリですが、意外と参照頻度が高く、関連するネタがあったので追記しておきます。
Windows 10 に .NET 2.0 用の ODP.NET をインストールする場合、本エントリの通り、事前に「.NET 3.5 の有効化」を施しておかないと自動的に GAC 登録してくれない、という話がありますが、つい最近「.NET 3.5 の有効化」を施しているにもかかわらず GAC 登録してくれないパターンに遭遇。
Oracle Database 12c Release 2 の 32bit 版クライアント win32_12201_client.zip にて事象確認。
ちなみに前バージョンの Oracle Database 12c Release 1 の winnt_12102_client32.zip では正常にGAC登録されるので、12.2 インストーラのバグ(処理漏れ)っぽい印象。
対策としては本エントリ記載の手動による GAC 登録を行えば OK です。
もはや ODP.NET を導入する際は手動 GAC 登録を必須とする運用にするしかないかもしれません…
■追記 2018-11-12
今更ながらの補足情報。
GAC 登録の対象として本体モジュール (Oracle.DataAccess.dll) しか書いていなかったのですが、ポリシー設定のファイルも一緒に GAC 登録しておかないとアプリごとにバージョンリダイレクトが必要になってしまいます。
1 2 3 4 5 |
> oraprovcfg /action:gac /providerpath:C:\app\Administrator\product\12.2.0\dbhome_1\ODP.NET\PublisherPolicy\2.x\Policy.2.102.Oracle.DataAccess.dll > oraprovcfg /action:gac /providerpath:C:\app\Administrator\product\12.2.0\dbhome_1\ODP.NET\PublisherPolicy\2.x\Policy.2.111.Oracle.DataAccess.dll > oraprovcfg /action:gac /providerpath:C:\app\Administrator\product\12.2.0\dbhome_1\ODP.NET\PublisherPolicy\2.x\Policy.2.112.Oracle.DataAccess.dll > oraprovcfg /action:gac /providerpath:C:\app\Administrator\product\12.2.0\dbhome_1\ODP.NET\PublisherPolicy\2.x\Policy.2.121.Oracle.DataAccess.dll > oraprovcfg /action:gac /providerpath:C:\app\Administrator\product\12.2.0\dbhome_1\ODP.NET\PublisherPolicy\2.x\Policy.2.122.Oracle.DataAccess.dll |
.NET 2.0/3.5 ベースのアプリから Oracle クライアント 12.2 を利用する場合は前述の通り手動による GAC 登録が必要ですので、特にご注意あれ。