お仕事で64bit環境と32bit環境が混在する環境への配布を行う必要があるのですが、その辺りについての「どうすべきか」がよく分からないので調べています。
64bit環境にODP.NET 64bit版をインストールしてみる
64bit環境であるWindows Server 2008 R2に、ODP.NETの64ビット版(ファイル名: ODAC112030_x64.zip)をインストールした後の状態がこんな感じです。ちなみに、事前に.NET Framework 4.0はインストールしています(Windows Server 2008 R2が標準でもっている.NET Frameworkは3.5まで)。
確認したフォルダは、「C:\Windows\Microsoft.NET\assembly¥GAC_64\Oracle.DataAccess」フォルダ。GACは64bit用と32bit用が別々に用意されていて、フォルダ名が「GAC_32」「GAC_64」のようにことなっています。というわけで、ODP.NETの64ビット版を入れるときちんとGACに登録されているっぽいところまでは確認。
32bit版としてビルドしたアプリを動かしてみる
次に、NGが期待されるパターンとして、動作プラットフォームに「x86」を指定した、Oracle.DataAccess.dllを用いたアプリを作成、検証用のWindows Server 2008 R2環境に放り込んでみました。アプリには以下の動きをさせています。
- Oracleに接続する(接続文字列中にプロトコルやらポート番号やら全部指定するタイプ、tnsnames.ora不要の方式)。
- OracleCommandを作成する。
- ボタンが押されると、Select文でテーブルの内容を取得、OracleDataReaderとして結果を得る。
- 切断する。
x86指定でビルドすると、自分のEXEファイルだけがBinフォルダに作成されました。これを仮想環境に構築したWindows Server 2008 R2 + .NET Framework 4.0 + ODP.NET 64bitの環境にコピーして動かした結果がこれです。
ポイントは、起動自体はするということ。これはWOW64で動いているんでしょうね。で、実際にOracle系オブジェクトを用いた処理を実行するボタンが押された時点でエラーが出ました。で、エラーメッセージの詳細は「FileNotFound」、メッセージにある「探しているアセンブリ」のPublicKeyTokenは、64bit版のOracle.DataAccess.dllのフォルダ名と同じでした。推測するに、32bitアプリとして動いているので、GAC_32に登録されているアセンブリを探しに行って、無いというオチになっているのではないかと。
AnyCPUとしてビルドしたアプリを動かしてみる。
次に、32bit環境用のODP.NETしか入っていないVisual Studio 2010環境で、コンパイル設定にて「AnyCPU」を指定してアプリを作成してみました。この時点で、x86の時と1つ違いが。それは「ビルドの結果が入ったフォルダにOracle.DataAccess.dllがコピーされている」という点。どういうことなんでしょ?このOracle.DataAccess.dllはどこから来たんでしょ?? AnyCPU指定を行うと、プログラムは実行された時点でプラットフォームを判別し、32bit、64bitそれぞれの設定で動きます。というわけで、試しに32bit環境(ビルド環境)で動かしたところ、問題無く動きました。
で、このファイル一式を64bit環境にコピーすると、これも問題無く動きました。さらに、BinフォルダにVisual StudioによってコピーされたOracle.DataAccess.dllを削除してみても……問題無く動きました。おそらくGACに入っているファイルを使っているのだと思います。
x64としてビルドしたアプリを動かしてみる。
では次に、32bit環境のODP.NETしか入っていないVisual Studio 2010環境で、コンパイル設定にて「x64」を指定してアプリを作成します。このときも、出力フォルダにはOracle.DataAccess.dllがコピーされました。一応、これをそのまま32bit環境で動かすと「〜は有効な Win32 アプリケーションではありません。」というエラーがでてプログラムは起動すらしません。
このファイル一式を64bit環境にコピーすると、問題無く動きました。
64bit版ODP.NETを使うアプリのビルドには、別に64bit環境は不要?
64bit版ODP.NETを用いたアプリをビルドするのに、別に64bit版の開発用ODP.NETがインストールされた環境を用意する必要は……無いようです。ただ、AnyCPUとx64を指定した際にビルド出力先フォルダに登場するOracle.DataAccess.dllが一体どこからきたものか、これは把握しておきたいのですが、ちょっとよく分かりません。