Oracle 如何在.NET3.5和.NET4中运行odp.net应用程序

Oracle 如何在.NET3.5和.NET4中运行odp.net应用程序,oracle,odp.net,odp.net-managed,Oracle,Odp.net,Odp.net Managed,我正在为我们的产品开发一个内部工具。我们的产品使用oracle数据库,并随着时间的推移从.net framework 2.0发展到4.5,从oracle 10发展到12.2。 该工具的目的是编写一个可跨产品的不同版本工作的应用程序 我已经通过在app.config中使用以下条目解决了多个.net framework版本的问题 <supportedRuntime version="v2.0.50727"/> <supportedRuntime version="v4.0"/>

我正在为我们的产品开发一个内部工具。我们的产品使用oracle数据库,并随着时间的推移从.net framework 2.0发展到4.5,从oracle 10发展到12.2。
该工具的目的是编写一个可跨产品的不同版本工作的应用程序

我已经通过在app.config中使用以下条目解决了多个.net framework版本的问题

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

由于oracle托管的.net驱动程序支持framework>=4.0,因此我不能使用它,因为我还必须支持.net framework 3.5。
由于我必须使用非托管odp.net驱动程序,我考虑了以下场景

  • 我的工具将使用最低版本的oracle.dataaccess.dll和target.net 3.5
  • 下面的#1让我提到了2.xx。。。。oracle.dataaccess.dll的版本
  • 当我在只安装了.net framework 4的计算机上运行此应用程序时,会出现什么行为?它会加载4.xx。。。在.net framework 4的上下文下运行时oracle.dataaccess dll的版本

    最好的解决方案是提供oracle托管驱动程序for.net 3.5版本,但我发现它不可用

    请提供宝贵的意见

    萨蒂什

    更新: 我已经编写了一个针对.NETFramework 3.5的示例应用程序。在这个示例应用程序中,我将构建一个连接字符串,然后打开并关闭一个连接。
    当app.config中没有标记时,此应用程序将成功运行。
    当我们在app.config中添加任何
    标记时,我得到了与oracle相关类型的类型初始值设定项异常。我已经用受支持的运行时标记尝试过了

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

    单独或两者结合。但我仍然明白这个问题。有人可以建议如何解决此问题吗?

    ODP.NET非托管驱动程序存在于以下版本中:

    • 1.x(.NET Framework 1.0.3705/1.1.4322),可在Oracle客户端11.1上使用
    • 2.0(.NET Framework 2.0.50727),与Oracle客户端10.2一起引入
    • 4.0(.NET Framework 4.0.30319),与Oracle客户端11.2一起引入
    如果编译目标是.NET版本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();
      
      使用

    但是,此语法仅在.NET Framework 4.0版上可用,我不知道如何在3.0/3.5版中编写此语法

    注意,使用
    con.GetType().Assembly.FullName
    con.GetType().Assembly.Location
    查看实际加载的DLL

    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)