【问题标题】:Having two ODP.NET (ODAC) versions in the same server在同一服务器中有两个 ODP.NET (ODAC) 版本
【发布时间】:2010-03-23 22:05:00
【问题描述】:

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

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

所以我想知道:

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

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

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

谢谢!!

【问题讨论】:

    标签: odp.net oracleclient


    【解决方案1】:

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

    • 在 Visual Studio 中,如果在 Oracle.DataAccess.dll 上设置 Specific Version = True,则该应用程序将不会使用任何其他版本,并且必须能够找到它所针对的版本。
    • 您是否将 DLL 与您的应用程序一起部署,或者希望它位于某个位置或 GAC 中。
    • 查找依赖 DLL 有一个特定的搜索顺序,而且涉及的内容非常多,请阅读this MSDN topic

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

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

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

    【讨论】:

    • 我认为“服务器”是指安装了 IIS 的 Windows 服务器,以便 ASP.NET 应用程序可以使用客户端库访问 Oracle。
    • @IgbyLargeman:很好。还有一个问题。 64 位客户端,将两个平台(版本 4.112.2)部署到 GAC。新应用程序将 4.112.3 用于 EF 功能,因此想法是 bin 部署它,胜过旧的 GAC 副本。 Visual Studio 仅复制本地 32 位。下一个想法是用 64 位版本的 4.112.3 覆盖该文件。它给了我同样的错误,就好像库根本不在垃圾箱里一样,就像它仍在使用旧的 GAC 64 库一样。有什么细节或建议吗?我是否可以 GAC 部署所有 4 个库(4.112.2 32/64 和 4.112.3 32/64)?谢谢
    【解决方案2】:

    这里的问题不是 .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 Client 的一个版本部署到一个应用程序池,将第二个版本部署到另一个应用程序池。例如,您可以让一个应用程序池使用 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 是一个非托管调用。

    【讨论】:

      猜你喜欢
      • 2019-02-27
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 2023-03-06
      • 2016-04-03
      相关资源
      最近更新 更多