如何让旧版本的OracleClient在.NET本地工作?

时间:2016-02-08 17:16:36

标签: .net oracle oracle11g odp.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。

如何在不更改底层DLL的情况下让应用程序正确连接到Oracle?请注意,我使用的是11gR2和Visual Studio 2013。

4 个答案:

答案 0 :(得分:1)

*.csproj中, *.vbproj编辑您对ODP.NET的引用,如下所示:

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

不需要Version=...processorArchitecture=...等属性。您的应用程序将加载正确的Oracle.DataAccess.dll,具体取决于所选的体系结构和目标.NET框架(前提是它已正确安装)

但是,您引用OracleClient.dll这是不推荐使用的Microsoft数据提供程序(Oracle and 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

答案 1 :(得分:0)

如果我是你,我会抛弃常规的Oracle.DataAccess.dll并将其替换为托管driver。您在oracle客户端bin目录中绑定到非托管dll的预托管驱动程序的问题。我已经构建了许多系统,将特定的dll(~130 MB)复制到应用程序的bin目录中,以便从我的应用程序中解除oracle安装。另一个问题是非托管驱动程序是32/64位特定的。因此,根据您部署应用程序的位置,事情也会变得混乱。

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

答案 2 :(得分:0)

简答:

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

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

TLDR答案:

首先,需要注意的是,ODP.net的2.x.x.x版本适用于.net框架版本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提供的发布者策略不太可能跳过主要修订,只是次要修订。

答案 3 :(得分:0)

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