Visual Studio 2013 で ODP.NET 64bit版 を使う!

Visual Studio 2013 で Oracle の ODP.NET を使った
64bit Webアプリの開発環境の作り方です。

実はここ数日、大ハマリしてました。(汗
下記にポイントを列挙しますが、まだ誤解等があるかも?

この記事を見た方、お気づきの点ございましたら、ご指摘頂ければ幸いです。

*2015.03.31 一部訂正

                                                                                                                                        • -

以下内容を明確にするため、
ODP.NETのマイナーバージョンの相違で発生する現象には触れていません。

■目指す状態
◆Server
OS:Windows2012(64bit)
IIS8(64bit)
DB:Oracle Database 12c(64bit)
Oracle Data Access(64bit)

◆Client(開発環境)
OS:Windows8.1 Pro(64bit)
Visual Studio2013 Pro(32bit)※
Oracle Data Access(32bit)
Oracle Data Access(64bit)
(↑32/64bit 両方インストールします。詳しくは後述)
IIS8.5 Express(64bit)

※運用環境でASP.NET Webアプリを64bit ネイティブで
動作させる為の開発環境を作る。


■留意事項
Visual Studio2013 が 32bit という事 ※ココ重要


■環境作成手順
◆Server
IIS8とASP.NET 4.5 をセットアップ

Oracle Database12c(64bit)インストール
ODP.NET(64bit)もインストールされる
インストールフォルダーは c:\Oracle 等にする

Oracle Data Provider for.NET の環境設定 ※ココ重要
(Oracle Home)\odp.net\managed\x64\configure.bat
を実行する。
これを忘れるとWebアプリ実行でSqlDataSourceなどの
Oracle.ManagedDataAccess.Client」の呼び出して
「要求された .net framework データプロバイダーが見つかりません」などの
エラーが返される。


◆Client(開発環境)
Visual Studio2013 インストール

・ODTwithODAC121012(32bit)インストール
32-bit Oracle Data Access Components (ODAC)
with Oracle Developer Tools for Visual Studio

インストールフォルダーは c:\Oracle 等にする
Oracle home は「OraClient12Home1」にする。

C:\Oracle\product\12.1.0\client_1\Network\Admin\tnsnames.ora


・ODAC121012(64bit)インストール
64-bit ODAC 12c Release 2 (12.1.0.1.2) for Windows x64

※32bit版とは異なるフォルダーにインストールする
インストールフォルダーは c:\Oracle64 等にする ※ココ重要!
Oracle home は「OraClient12Home2」にする。 ※ココ重要!

C:\Oracle64\product\12.1.0\client_1\Network\Admin\tnsnames.ora

64bit版のODACはVisual Studio に対応している訳ではないので
「ODT」は付いていないのがミソ

Oracle Data Access
Visual Sutudio用の(開発ツールとしての)32bit版と
Webアプリ(ランタイム)で使う64bit版の両方が必要

Visual Studio 2013 の設定
・デバックで使う IIS Express の設定
[ツール]-[オプション]-
[プロジェクトおよびソリューション]
   (開いた直後は見えないかも?[環境]の上にある)
    [Webプロジェクト]
Webサイトおよびプロジェクト用IIS Expressの64ビットバージョンを使用
にチェックする。(デフォルトでは32bitで動作する)

・プロジェクト内の参照設定
64bit版を参照する
Oracle.DataAccess
(C:\Oracle64\product\12.1.0\client_1\ODP.NET\bin\4\Oracle.DataAccess.dll)
Oracle.ManagerDataAccess
(C:\Oracle64\product\12.1.0\client_1\ODP.NET\managed\common\Oracle.ManagedDataAccess.dll)
Oracle.Web
(C:\Oracle64\product\12.1.0\client_1\ASP.NET\bin\4\Oracle.Web.dll)
※「ローカルコピー」「特定バージョン」などのプロパティの設定は環境に合わせて設定

・サーバーエクスプローラ
32bit版を使う(何も考えなければ見えるのは32bit版)
「現在使用中のtnsnames.ora」には
C:\Oracle\product\12.1.0\client_1\Network\Admin\tnsnames.ora
が表示されているハズ

・構成マネージャー
Debug :x64
Ralease:x64

※表面的には32/64bitのどちらで動作しているかわかりにくい。
スタートアップのフォームで下記のようなコードを埋め込めば
確実に確認出来る。

(C#の場合)

if (System.Environment.Is64BitProcess)
{
    this.Label1.Text = "64bit";
}
else
{
    this.Label1.Text = "32bit";
}

・Webを発行
発行内の「設定」
「ファイル発行オプション」
□発行中にプリコンパイルする はチェックしない ※ココ重要

発行中にプリコンパイルすると
「ファイルまたはアセンブリ '****'、またはその依存関係の
1つが読み込めませんでした。
間違ったフォーマットのプログラムを読み込もうとしました。」
という致命的なエラーが表示され発行できない。

                                                                                                                                        • -