Oracle 11(32ビット)とOracle 12(64ビット)の問題があります。 32ビットのウィンドウを持つプラットフォームがあるため、32ビットのOracle11を標準化しました。 WinFormsのアプリケーションとAspサイトは、すべてのプラットフォームで32ビットモードで正常に動作します。IISでIIS-Expressと同じバージョンのOracleを使用する方法
私のマシンには、両方のOracleバージョンがあります。私はVisualStudio 2015で開発し、IISExpressでデバッグします。しかし、開発マシンでIISを実行しているときに、64ビットのOracle 12を実行しようとすると、例外がスローされます。Oracle.DataAccess.Client: the provider is not compatible with the version of Oracle Client.
Oracle 12をアンインストールするのは複雑なので、インストールディレクトリの名前を変更して無効にしましたc:\oracle\product\12.1.0XXX
。また、レジストリキーHKLM/Software/Oracle
はOracle 12を指し、Oracle-11のみのサーバーには存在しないため、削除しました。
また、GACから2.121.2.0用のOracle dllをアンインストールしました。
リブート後、VS2015とIISExpressはOracleコードで正常に動作しますが、IISを使用するとエラー:Unable to load DLL 'OraOps12.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
が表示されます。これは、IISがIISExpress以外の場所でOracle DDLを探すことを示しています。
Oracle11は、Oracle11より前のPATH変数に記述されています。今日はPATHを簡単に変更する方法がわからないので、昔はautoexec.batに設定されていましたが、Oracle12のパス名を変更することでそれが解決されました。アプリケーションはPATHに記述されているすべてのディレクトリを調べ、Oracle12ディレクトリが存在しない場合はPATHの次のディレクトリを探し続けます。ただし、IISが明示的にOraOps12.dll
を探している場合、Oracle11は使用されません。
私の質問は、IISにIISExpressと同じOracle DLLを使用させる方法です。
Procmonを使用すると、DLLを探す場所をすべて表示できます。私はIISのDLLロード戦略についてはわかりませんが、PATHに基づいているため、LoadLibraryの呼び出しはパスなしで何をするのでしょうか。また、レジストリに格納されたパスを使用することもできます(PROCMONはレジストリへのアクセスも表示します)。 –
@ LouFranco更新された質問のPATHを参照してください – Roland
あなたが言うことに基づいて、私はあなたが本当にOracle 12をアンインストールする必要があると思います。私の推測では、レジストリの何かがそれを制御しています。 –