如何在.net 3.5和.net 4

时间:2016-04-13 08:05:33

标签: oracle odp.net odp.net-managed

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

我通过在app.config

中使用以下条目解决了多个.net框架版本的问题
<supportedRuntime version="v2.0.50727"/>
<supportedRuntime version="v4.0"/>

由于oracle托管的.net驱动程序支持框架&gt; = 4.0,我不能使用它,因为我还必须支持.net framework 3.5。 由于我必须使用非托管odp.net驱动程序,我正在考虑以下场景

  1. 我的工具将使用最低版本的oracle.dataaccess.dll和目标.net 3.5。
  2. 上面的#1使我参考2.xx ....版本的oracle.dataaccess.dll。
  3. 当我在只安装了.net framework 4的机器上运行此应用程序时,会出现什么行为?在.net框架4的上下文中运行时,它会加载4.xx ...版本的oracle.dataaccess dll吗?

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

    请提供您宝贵的意见。

    萨蒂什南比亚

    更新: 我编写了一个针对.net framework 3.5的示例应用程序。在这个示例应用程序中,我将构建一个连接字符串,然后打开一个连接并关闭它 当app.config中没有<supportedRuntime>标记时,此应用程序成功运行 当我们在app.config中添加任何<supportedRuntime>标记时,我将获得oracle相关类型的类型初始化程序异常。我已尝试使用支持的运行时标记

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

    单独和两者结合。但我仍然遇到了这个问题。任何人都可以建议如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

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

  • 1.x(.NET Framework 1.0.3705 / 1.1.4322),适用于Oracle Client 11.1。
  • 2.0(.NET Framework 2.0.50727),随Oracle Client 10.2一起推出
  • 4.0(.NET Framework 4.0.30319),随Oracle Client 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();
    

    使用

    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版本中编写。

注意,使用con.GetType().Assembly.FullNamecon.GetType().Assembly.Location以查看哪个DLL确实已加载。