6

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

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

所以我想知道:

1)如果真的有可能在一台服务器上有两个不同的 ODAC 版本。

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

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

谢谢!!

4

2 回答 2

10

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

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

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

  1. 将特定版本设置为 True;
  2. 使用您的应用程序部署 DLL 并将其驻留在应用程序目录中,或者确保 DLL 在 GAC 中。

在您的具体情况下,您的同事可能有一个有效的担忧:如果他当前安装的应用程序正在从 GAC 获取 Oracle.DataAccess.dll,并且他没有将特定版本设置为 True,那么当您安装新的 ODAC 时,他的应用程序将开始使用它(我假设新的 Oracle.DataAccess.dll 也将安装在 GAC 中),

于 2010-03-24T20:17:20.087 回答
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 Home: 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 Home。每个活动的 Oracle Home 必须位于不同的池中。3) 为每个工作进程设置 DLL 目录以使用适当的 Oracle Home 客户端目录。为此,在每个 ASP.NET 应用程序中,在调用任何 Oracle DLL 之前,在应用程序生命周期的早期调用 SetDllDirectory(directory_name)。SetDllDirectory 输入变量是使用的 ODP.NET 版本的 Oracle Home bin 目录。注意:SetDllDirectory 是一个非托管调用。

于 2010-04-12T07:39:54.700 回答