2017-10-18 140 views
2

我在使用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.我的猜測是,註冊表中的某些內容正在控制它。 –

回答

0

沒有工作,所以我卸載了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,或者你會後悔。

相關問題