在同一服务器中有两个ODP.NET(ODAC)版本

时间:2010-03-23 22:05:00

标签: odp.net oracleclient

几个月前,我的一位同事在使用XCOPY的服务器上安装了ODAC 11.106.21,然后他开发了许多使用该客户端的应用程序没有问题(在测试和生产Windows服务器中)。

上周,我在ODAC 11.1.07.20下开发了一个应用程序。当我让他在不同的文件夹中使用XCOPY安装这些新的ODAC版本,然后将我的应用程序包含在测试服务器中时,他回答我应该使用ODAC 11.106.21因为他的应用程序可能会遇到麻烦。

所以我想知道:

1)如果一台服务器中确实可以有两个不同的ODAC版本。

2)如果答案是肯定的,我怎样才能向我的同事坚定地确保他的申请不会有麻烦?

3)如果答案是肯定的,是否有必要在服务器中进行某种配置?

谢谢!

2 个答案:

答案 0 :(得分:9)

您可以在同一台计算机上拥有多个版本的ODAC,但是每个应用程序将使用哪个版本需要注意几个方面。这实际上适用于所有组件。

  • 在Visual Studio中,如果在Oracle.DataAccess.dll上设置Specific Version = True,那么该应用程序将不会使用任何其他版本,并且必须能够找到它构建的版本。
  • 您是将DLL与您的应用程序一起部署还是希望它位于特定位置或GAC中。
  • 有一个特定的搜索顺序,用于查找相关的DLL,它非常复杂,所以请阅读this MSDN topic

简短的回答是,有两种简单的方法可以确保您的应用程序使用您想要的确切版本的Oracle.DataAccess.dll(这适用于大多数其他情况都是默认的情况):

  1. 将特定版本设置为True;
  2. 使用您的应用程序部署DLL并将其驻留在应用程序目录中,或者确保DLL位于GAC中。
  3. 在您的具体情况下,您的同事可能有一个有效的顾虑:如果他当前安装的应用程序从GAC获取Oracle.DataAccess.dll,并且他没有将特定版本设置为True,那么当您安装新的ODAC,他的应用程序将开始使用它(我假设新的Oracle.DataAccess.dll也将安装在GAC中),

答案 1 :(得分:4)

这里的问题不是.NET dll,而是非托管dll。

我试图在一台服务器上运行两个ASP.NET应用程序。一个是使用ODP.NET 9.x的旧版本和使用最新ODP.NET的新版本。我使用xcopy部署了最新的ODP.NET,并为新的ODP添加了PATH环境变量的路径。现在旧的应用程序不起作用(可能尝试使用新的dll)。当我从PATH变量中删除路径时,新的应用程序不起作用。我找到了使它在Oracle页面上的IIS下的一台服务器上工作的方法,但是没有用。也许是因为我没有安装最新的ODP.NET,只是对它进行了复制。我将不得不尝试。

Oracle所说的: 链接:http://www.oracle.com/technology/tech/windows/odpnet/faq.html 许多Oracle应用程序在Microsoft Internet信息服务(IIS)上运行。以前,IIS是一个单进程应用程序,无法使用相同的IIS实例为每个正在运行的Web应用程序分配不同的系统路径。使用Windows Server 2003上的IIS 6,IIS支持同一实例的多个进程。由于每个应用程序都有自己的IIS进程,因此可以为每个Web应用程序分配一个具有自己的Oracle主目录的不同系统路径目录。

Microsoft文档提供有关IIS工作进程隔离和应用程序池的信息。

设置在同一IIS服务器上并发运行的多个活动Oracle主目录: 1)在Windows Server 2003上以工作进程隔离模式运行IIS 6 2)将一个版本的Oracle客户端部署到一个应用程序池,将第二个版本部署到另一个应用程序池。例如,您可以让一个应用程序池使用Oracle Client 9.2.0.2和ODP.NET 9.2.0.2。并且Oracle Client 9.2.0.4和ODP.NET 9.2.0.4可以被另一个应用程序池使用。您将无法在同一应用程序池中使用两个活动的Oracle主目录。每个活动的Oracle Home必须位于不同的池中。 3)为每个工作进程设置DLL目录以使用适当的Oracle Home客户端目录。为此,在每个ASP.NET应用程序中,在调用任何Oracle DLL之前,在应用程序生命周期的早期调用SetDllDirectory(directory_name)。 SetDllDirectory输入变量是使用的ODP.NET版本的Oracle Home bin目录。注意:SetDllDirectory是一个非托管调用。