【问题标题】:How to get IIS to use the same version of Oracle as IIS-Express如何让 IIS 使用与 IIS-Express 相同版本的 Oracle
【发布时间】:2018-03-30 10:22:18
【问题描述】:

我在使用 Oracle 11(32 位)和 Oracle 12(64 位)时遇到问题。由于这里的一些平台仍然有 32 位窗口,我们使用 32 位 Oracle11 进行标准化。 WinForms 应用程序和 Asp 站点在我们所有的平台上都可以在 32 位模式下正常工作。

只有我的开发机器有两个 Oracle 版本。我使用 VisualStudio 2015 开发并使用 IISExpress 进行调试。但是,在我的开发机器上运行 IIS 时,它尝试运行 64 位 Oracle 12,并抛出异常 Oracle.DataAccess.Client: the provider is not compatible with the version of Oracle Client.

卸载 Oracle 12 似乎很复杂,所以我所做的是通过将安装目录重命名为 c:\oracle\product\12.1.0XXX 来禁用它。另外,我删除了注册表项 HKLM/Software/Oracle,因为它指向 Oracle 12,并且在只有 Oracle-11 的服务器上不存在。

我还从 GAC 卸载了 2.121.2.0 的 Oracle dll。

重启后,VS2015 和 IISExpress 仍然可以正常使用 Oracle 代码,但使用 IIS 我看到错误:Unable to load DLL 'OraOps12.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)。这表明 IIS 在 IISExpress 之外的其他地方寻找 Oracle DDL。

Oracle12 在 Oracle11 之前的 PATH 变量中被提及。由于我今天不知道如何轻松更改 PATH,在过去它是在 autoexec.bat 中设置的,我认为通过重命名 Oracle12 路径,它得到了照顾。应用程序将探测PATH中提到的所有目录,如果Oracle12目录不存在,将继续查找PATH中的下一个目录。但是,如果 IIS 明确地寻找 OraOps12.dll,它永远不会使用 Oracle11。

我的问题是如何让 IIS 使用与 IISExpress 相同的 Oracle DLL?

【问题讨论】:

  • 您可以使用 Procmon 查看它可能会查找 DLL 的所有位置。我不知道 IIS 的 DLL 加载策略,但它通常基于 PATH,因为 LoadLibrary 调用在没有路径的情况下会做什么。它也可能使用存储在注册表中的路径(PROCMON 也会显示注册表访问)。
  • @LouFranco 请在更新后的问题中查看 PATH
  • 根据您的说法,我认为您需要真正卸载Oracle 12。我的猜测是注册表中的某些东西在控制它。
  • 您可能想使用 IIS 管理器查看 Oracle 是否安装为 ISAPI 过滤器。
  • 我有一个解决办法:卸载Oracle,使用SQL Server!

标签: oracle iis oracle11g iis-express oracle12c


【解决方案1】:

没有任何效果,所以我卸载了 Oracle 12。这解决了问题。

我尝试解决的原因是卸载 Oracle 12 非常麻烦。只能卸载所有Oracle,然后重新安装Oracle 11,所有步骤都很慢。整个工作大约花了一个半小时。后来发现我的 dll 版本是 2.112.1.0 而不是 2.111.7.20,所以我必须在 Visual Studio 中的几个(但不是全部)项目中替换引用才能构建。

最重要的是,您不应该在您的 C# Asp.Net 项目中尝试来自 Oracle 12 的 64 位 Oracle dll。坚持使用 32 位 Oracle 11,否则你会后悔的。

【讨论】:

    猜你喜欢
    • 2013-03-28
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多