2016-04-13 60 views
0

私は、私たちの製品の内部ツールを開発中です。当社の製品は、Oracleデータベースを使用しており、.netフレームワーク2.0から4.5およびOracle 10から12.2へと時間をかけて進化してきました。
ツールの目的は、製品の異なるバージョン間で動作する1つのアプリケーションを作成することです。.net 3.5と.net 4の両方でodp.netアプリケーションを実行する方法

Iは、Oracleは、.NETドライバがフレームワーク> = 4.0でサポートされて管理されるように、私は使用できないApp.configファイル内の次のエントリを使用して

<supportedRuntime version="v2.0.50727"/> 
<supportedRuntime version="v4.0"/> 

を複数の.NET Frameworkのバージョンの問題を解決しましたこれは、私も.netフレームワーク3.5をサポートする必要があります。
私は非管理odp.netドライバを使用する必要がありますように、私は私のツールは3.5、.NET oracle.dataaccess.dllとターゲットの最低バージョンを使用することになり、次のシナリオ

  1. 考えていました。
  2. 上記の#1の後に、oracle.dataaccess.dllの2.xx ....バージョンを参照してください。

このアプリケーションを.NET Framework 4しかインストールされていないマシンで実行すると、どのような動作になりますか?それは4.xx ... oracle.dataaccess dllのバージョンをロードしますか?.NET Framework 4のコンテキストで実行していますか?

ベスト・ソリューションは、.net 3.5バージョン用のOracle管理対象ドライバの可用性でしたが、使用できないことがわかりました。

貴重な情報を入力してください。

サティシュ

UPDATE: 私は、.NET Framework 3.5をターゲットとサンプルアプリケーションを書かれています。このサンプルアプリケーションでは、接続文字列を作成し、接続を開いて閉じます。
<supportedRuntime>タグがapp.configに存在しない場合、このアプリケーションは正常に実行されます。
<supportedRuntime>タグをapp.configに追加すると、oracle関連型の型初期化子例外が発生します。私はこれをサポートされたランタイムタグで試しました。

<supportedRuntime version="v2.0.50727"/> 
<supportedRuntime version="v4.0"/> 

個別に両方を組み合わせました。しかし、私はまだ問題を抱えています。誰もこの問題を解決する方法を提案できますか?

答えて

0

ODP.NET管理されていないドライバは、以下のバージョンに存在します。Oracle Clientの11.1まで利用可能

  • 1.1(.NET Frameworkの1.0.3705/1.1.4322)、。あなたのコンパイルターゲットは.NETバージョンである場合のOracle Client 11.2

で導入されたOracleクライアント10.2

  • 4.0(.NET Frameworkの4.0.30319)、で導入
  • 2.0(.NET Frameworkの2.0.50727)、 3または3.5の場合、アプリケーションはODP.NETバージョン2.0をロードしようとします(マシン上に見つからない場合は例外が発生します)。実際には、ODP.NETバージョン4.0も受け入れるかどうかはわかりません。

    コンパイルターゲットが。NETバージョン4以上では、アプリケーションはODP.NETバージョン4.0をロードしようとします(マシン上に見つからない場合は例外が発生します)。

    あなたはいくつかのソリューションを行うことができます。

    • はあなたのバージョンと一致Oracle.DataAccess.dllのコピーを提供し、アプリケーションのディレクトリにそれを置きます。

    • 使用遅延バインディング、つまり代わりに

      var con = new Oracle.DataAccess.Client.OracleConnection(); 
      

      使用

      var DLL = Assembly.Load(String.Format("Oracle.DataAccess, Version={0}.{1}.*.*, Culture=neutral, PublicKeyToken=89b483f429c47342", frameworkVersion, oracleVersion)); 
      var type = DLL.GetType("Oracle.DataAccess.Client.OracleConnection", true, false); 
      dynamic con = Activator.CreateInstance(type) 
      

    しかし、この構文は、上の.NET Frameworkバージョン4.0からのみ利用可能ですが、私は方法がわかりませんこれをバージョン3.0/3.5に書いてください。

    実際にロードされたDLLを確認するには、con.GetType().Assembly.FullNamecon.GetType().Assembly.Locationを使用してください。

  • 関連する問題