如何让IIS使用与IIS-Express相同版本的Oracle

如何让IIS使用与IIS-Express相同版本的Oracle

问题描述:

我在使用Oracle 11(32位)和Oracle 12(64位)时遇到问题。由于这里有些平台仍然有32位窗口,我们使用32位Oracle11进行标准化。 WinForms应用程序和Asp网站在我们所有平台上以32位模式正常工作。如何让IIS使用与IIS-Express相同版本的Oracle

只有我的开发机器有两个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卸载了Oracle dll for 2.121.2.0。

重新启动后,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?

+0

您可以使用Procmon查看它可能查找DLL的所有位置。我不知道IIS的DLL加载策略,但它通常基于PATH,因为LoadLibrary调用将在没有路径的情况下执行。它也可以使用存储在注册表中的路径(PROCMON也会显示注册表访问)。 –

+0

@LouFranco请参阅PATH的更新问题 – Roland

+0

根据您的说法,我相信您需要真正卸载Oracle 12.我的猜测是,注册表中的某些内容正在控制它。 –

没有工作,所以我卸载了Oracle 12.这解决了这个问题。

我试图解决的原因是卸载Oracle 12非常麻烦。只能卸载所有的Oracle,然后重新安装Oracle 11,所有步骤都很慢。整个工作大约需要一个半小时。然后,事实证明我有2.112.1.0版本,而不是2.111.7.20,所以我不得不在Visual Studio中的几个,但不是所有项目中的引用能够建立。

底线是你不应该在你的C#Asp.Net项目中尝试来自Oracle 12的64位Oracle dll。只要坚持到32位Oracle 11,或者你会后悔。