結論と私の環境
下記手順でOracle Instant Client の環境を設定する。
- Oracle Instant Client の x64, x86 を用意し、それぞれシンボリックリンクを作成する。
- 環境変数PATHに、x64 のシンボリックリンクのパス情報を通す。
- 環境変数PATHに、基本的に利用したいビット数の Instant Client のパス情報を通す。
私の環境変数は下記の通りになっている。
私は、すべてユーザー環境変数に設定している。
| 環境変数名 | パス |
|---|---|
| IC_HOME | C:\Windows\System32\oracle_instant_client_11.2.0.4 C:\Oracle\11.2.0.4.0x86 |
| Path | %IC_HOME% |
※ Path は、先頭に挿入して、元々あるやつは消さない!
共存させたい理由
Visual Studio の開発で、x64限定のライブラリを利用している時、実行プラットフォームを x64 にするわけだが、この状態で、Instant Client (ODP.NET) をx86、x64 のどちらともインストールされていると、どうも接続がうまくできない。
『Oracle クライアント ライブラリを読み込もうとしましたが、BadImageFormatException が発行されました。この問題は、32 ビットの Oracle クライアント コンポーネントがインストールされている環境で 64 ビット モードを実行すると発生します。』
って言われる。
でも、開発環境を分離できない状況で、x86 としても開発するし、x64 でも開発するし、だとすると、Instant Client を入れたり消したりなどしないとダメそうで勝手が悪い。
やり方
Oracle Instant Client の64ビット版と32ビット版を共存させる方法に載ってた。
System32 と SysWOW64 に、それぞれシンボリックリンクを張ればいいそうな。
x64, x86 のInstant Client を入手して任意の場所に配置したうえで、
管理者権限でコマンドプロンプトを実行して、下記コマンドを実行する。
『oracle_instant_client12_2』部分が共用される名前になるので、どちらも同一でなければならない。
また、x64とx86で、全く同じバージョンの Instant Client を用意した方がいいかな。
-- x64のシンボリックリンクを張る
cd C:\Windows\System32
mklink oracle_instant_client12_2 C:\Oracle\instantclient_12_2x64
-- x86のシンボリックリンク張る
cd C:\Windows\SysWOW64
mklink oracle_instant_client12_2 C:\Oracle\instantclient_12_2x86
んで、環境変数のPATHに、x64 のシンボリックリンクのパスを通す。
| 環境変数名 | パス |
|---|---|
| Path | C:\Windows\System32\oracle_instant_client12_2 |
※ Path は、先頭に挿入して、元々あるやつは消さない!
意味と実行時の流れのイメージ
C:\Windows\System32 にあるシンボリックリンクが、x64 で動作する Instant Client の資材になる。
C:\Windows\SysWOW64 にあるシンボリックリンクが、x86 で動作する Instant Client の資材になる。
この状態で、x64 アプリケーションを実行したときには x64 のシンボリックリンクが有効になって、x64 の Instant Client が利用される。
同様に、x86 アプリケーションを実行したときには x86 のシンボリックリンクが有効になって、x86 の Instant Client が利用される。
確認
Visual Studio でx86、x64 プラットフォームどちらでも接続ができた!
足りないこと
上記の方法はアプリケーションを実行したときに利用される。 Instant Client の実行イメージを切り替えるものであり、コマンドについても対応しているわけではない。
コマンドプロンプトから sqlplus などを実行したい場合は、そのパスも環境変数のPATHに追加しなければならない。
また、 SI Object Browser では、制御がうまくできないようで、やっぱり環境変数を追加しないとダメ。(もしくは、Object Browser に限って言えば、詳細設定タブにある ORACLE_HOME を設定すればいいと思う)