如何让旧版本的 OracleClient 在本地使用 .NET



当我使用Oracle.DataAccess.dll创建一个新的.NET应用程序时,它工作正常。 但是,我需要编辑安装了旧版本的 Oracle.DataAccess.dll 的现有 Web 应用程序,当我尝试在本地运行它时,它会抛出我们的老朋友"提供程序与 Oracle 客户端版本不兼容"异常。

该应用程序上的现有版本是 2.112.1.2。 我有两个版本可用;4.112.4.0 和 2.112.4.0。 (我创建的应用程序使用4.112.4.0。 "明显"的答案是在我的应用程序中使用 4.112.4.0 版本,但该应用程序调用了我无法更改的 DLL,它也使用 2.112.1.2。

如何让应用正确连接到 Oracle,而无需更改基础 DLL? 请注意,我使用的是 11gR2 和 Visual Studio 2013。

在你的*.csproj中,或者。 *.vbproj像这样编辑对 ODP.NET 的引用:

    <Reference Include="Oracle.DataAccess">
      <SpecificVersion>False</SpecificVersion>
      <Private>False</Private>
    </Reference>

Version=...processorArchitecture=...等属性不是必需的。应用程序将根据所选体系结构和目标 .NET 框架加载正确的Oracle.DataAccess.dll(前提是正确安装(

但是,您指的是OracleClient.dll已弃用的Microsoft数据提供程序(Oracle 和 ADO.NET(,但随后您编写了版本 4.112.4.0 和 2.112.4.0,这是 Oracle 数据提供程序(ODP.NET、Oracle.DataAccess.dll(。你把它混在某个地方。

您选择的目标框架版本是什么?当您设置 4.0 或 4.5 或 4.5.1 时,它将尝试加载 Oracle dll 版本 4.x。要使用版本 2.x,您必须设置目标框架 2.0、3.0 或 3.5

如果我是你,我会放弃常规的Oracle.DataAccess.dll并用托管驱动程序代替它。 绑定到 oracle 客户端 bin 目录中的非托管 dll 的预托管驱动程序的问题。 我已经构建了许多系统,将特定的DLL(~130 MB(复制到应用程序的bin目录中,以将Oracle安装与我的应用程序分离。 另一个问题是非托管驱动程序特定于 32/64 位。 因此,事情也可能变得混乱,具体取决于您部署应用程序的位置。

托管驱动程序修复了这些问题,并将文件大小缩小到 10mb 以下。 您可以使用 NuGet 管理引用。

简短回答:

从服务器(或从 gac 中(复制 Oracle.DataAccess.dll 并在项目中引用该 dll 进行编译。 保留特定版本=true。

然后,请确保安装 odp.net 附带的发布者策略。 我相信它们位于oraclehome\odp.net\PublisherPolicy。 这会在开发计算机上运行时将引用的服务器版本的绑定重定向到较新版本,同时仍允许它在服务器上工作。

TLDR答案:

首先,请务必注意,ODP.net 的 2.x.x.x 版本适用于 .net Framework 版本 2/3.5。 4.x.x.x 版本适用于 .net 4.x。

因此,如果您正在编译 2.0/3.5 应用程序,则至少需要 2.x.x.x 版本的某个版本。

我第二次升级到托管驱动程序,但同样,我认为这只是 .net 4.x 的一个选项,这可能比你愿意做的更多。

当我使用非托管驱动程序时,这就是我所做的。

  • 我总是复制需要引用到项目本身并引用该文件的程序集,即使该文件位于 GAC 中也是如此。 这样,无论我的计算机上安装了什么,都可以始终编译该应用程序。

  • 我将引用上的特定版本设置设置为 true。 我从来不习惯执行制造商可能认为不兼容的代码的想法。 我总是担心我会得到一些奇怪且难以调试的行为。

  • 相反,我依赖于 odp.net 安装中包含的发布者策略(我认为它们位于oraclehome\odp.net\PublisherPolicy(。 这允许将 GAC 中的程序集请求重定向到其他版本。 您可以在此答案上看到 GAC 中的策略屏幕截图:https://stackoverflow.com/a/15509914/852208

这样,服务器升级就可以进行,而无需重新编译所有内容。 请记住,oracle 提供的发布者策略不太可能跳过主要修订,只会跳过次要修订。

我有一个旧应用程序存在同样的问题。我所做的是在我的项目(示例(RefDLL 中创建一个文件夹。然后,我将旧Oracle DLL的副本放在该文件夹中,并在VS Studio项目中引用该DLL进行编译。然后将代码推送到服务器(OLD DLL 在 GAC 中的位置(站点工作正常。

最新更新