我在使用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?
您可以使用Procmon查看它可能查找DLL的所有位置。我不知道IIS的DLL加載策略,但它通常基於PATH,因爲LoadLibrary調用將在沒有路徑的情況下執行。它也可以使用存儲在註冊表中的路徑(PROCMON也會顯示註冊表訪問)。 –
@LouFranco請參閱PATH的更新問題 – Roland
根據您的說法,我相信您需要真正卸載Oracle 12.我的猜測是,註冊表中的某些內容正在控制它。 –