0

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

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

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

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

  1. 我的工具将使用最低版本的 oracle.dataaccess.dll 和目标 .net 3.5。
  2. 在上面的#1 之后,我参考了 oracle.dataaccess.dll 的 2.xx.... 版本。

当我在仅安装 .net framework 4 的机器上运行此应用程序时,会出现什么行为?在 .net framework 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"/>

单独和两者结合。但我仍然遇到问题。谁能建议如何解决这个问题?

4

1 回答 1

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 客户端 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();
    

    利用

    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.FullNameandcon.GetType().Assembly.Location来查看真正加载了哪个 DLL。

于 2016-04-13T09:26:48.467 回答