我們平時使用的都是32位的機器進行開發,裝的都是32位的軟體,但是我們的伺服器一般都是64位的,所以有時也需要在64位的環境下裝一個VS偵錯工具。最近遇到的一個問題就是一個同事換了一個電腦,用的是X64的Windows 2008作為作業系統,要進行Oracle的資料庫連接,所以也裝了64位的Oracle用戶端。如果是控制應用項目或者WinForm項目可以正常串連Oracle,但是Web項目在程式中開啟Oracle串連時,系統拋出了異常:
嘗試載入 Oracle 用戶端庫時引發 BadImageFormatException。如果在安裝 32 位 Oracle 用戶端組件的情況下以 64 位元模式運行,將出現此問題。
顯然,這個提示的不正確,因為我們裝的就是64位的用戶端,所以並不存在64位程式調用32位用戶端的情況。難道是產生的程式是32位的,然後32位調用了64位的用戶端,於是我把程式屬性中的產生平台改為X64,:
結果這樣產生的WebService程式在調用時還是報同樣的異常。這個問題困擾了我一天,其中想到的解決辦法就是把64位的用戶端卸載了,在X64的作業系統中安裝32位的用戶端,然後這樣就可以了,但是如果不是Web應用(比如控制台應用程式或者WinForm程式)卻同樣報錯,那就需要將非Web應用的項目按照的設定方法,將產生的平台改為X86才能正常運行。
解決辦法:
這當然是一個折中的辦法,今天終於發現了真正的原因,原來VS在建Web項目時,平時運行使用的是內建的WebDev.WebServier是一個32位的服務,所以在其中啟動並執行Web項目不管怎麼設定平台,都只能作為32位的應用來看待,所以在Web項目運行時串連64位的Oracle用戶端會報錯,而非Web項目就不會。
網上搜了一下,好像WeDev服務好像沒有64位的,所以要解決這個問題,那麼就不要使用這個服務作為Web服務,而使用IIS,因為IIS使用的是w3wp,在64位的作業系統中是64位的,所以可以正常使用64位的Oracle用戶端。具體設定如下:
這樣設定後,每次運行就好以IIS來運行,不管是Web項目還是控制台應用項目或者WinForm項目,都會正常串連Oracle了。