【茶包射手日記】OracleClient偶發Load a Program with an Incorrect Format錯誤

同事在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的動作,這便解釋了為什麼大部分資料庫動作正常,在啟用分散式交易時才會產生錯誤的現象。

真相大白,收隊回家~

歡迎推文分享:
Published 15 February 2012 01:42 PM 由 Jeffrey
Views: 4,904



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<February 2012>
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication