同事在Visual Studio 2010(ASP.NET Development Server)執行Web Site專案進行偵錯,某段以OracleClient執行Oracle指令的公用方法,在某些情境下OracleConnection.Open()會彈出"An attempt was made to load a program with an incorrect format.",但大部分時候卻又正常。而同一支程式,在其他機器的VS2010及測試台IIS上執行都沒有問題,初步推測是同事機器的環境問題,且與Oracle Client x86/x64版本有關!

面對的第一個疑問其實埋在心中很久了... 使用ASP.NET Dev Server執行網站專案時,並沒有任何地方可以指定編譯成x86或x64,所以網站程序會是32位元還是64位元? 答案是"ASP.NET Dev Server永遠都是以32位元執行"(As Visual Studio is a 32-bit application, so the ASP.NET Development Server is designed to be in 32-bit. 參考來源),如果要測試64位元模式,建議改部置到IIS上偵錯。

確定ASP.NET Dev Server是32位元後,下個問題是: 為何會"偶而"抓不到32位元Oracle Client?

經檢查,出錯機器有同時安裝Oracle Client x86與x64版本,而且大部分Oracle指令能正確執行,可證實32位元版的Oracle Client的確可用,為何會偶發誤載64位元版本的錯誤則是個謎。

"上吧! 皮卡丘Process Monitor,就決定是你了!"

茶包一哥出手,茶包無所遁形。追蹤結果顯示: 出錯時Dev Server正試著要存取oramts.dll,先試著在32位元Client路徑(client_x32\bin)下讀取檔案,找不到後再依著PATH環境變數的設定一一尋找,最後在64位元Client路徑(client_1\bin)下找到64位元版oramts.dll,於是試著載入時引發了DLL Incorrect Format錯誤。由於當啟用TransactionScope時,OracleConnection.Open()需參與分散式交易才會觸發載入oramts.dll的動作,這便解釋了為什麼大部分資料庫動作正常,在啟用分散式交易時才會產生錯誤的現象。

真相大白,收隊回家~


Comments

Be the first to post a comment

Post a comment