【发布时间】: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