2008-06-16

在64-Bit作業系統執行會呼叫到32-Bit元件的程式

前陣子在 64-Bit 的 Windows 2008 上發佈了一個網站程式, 雖然過程中有點小障礙(因為 IIS 7.0 的介面完全不一樣, 很多東西要重新找一遍, 還有 web.config 要透過 appcmd 來作 migrate, 除了這兩個障礙以外, 其他的都還算簡單), 但是還是順利完成

可是後來在做測試的時候, 發現有一個呼叫 COM 元件的網頁一直出現錯誤, google 了一下說是因為在 64-Bit 環境中使用到 32-Bit 資源所導致的, 解決的方法是 you need to change CPU type from “Any CPU”, to “x86″, 可是這是 Web Application, 上述的解決方法根本不可行, 一定還有別的出路, 後來終於在 IIS 的 Application Pools 找到了相關的設定, 只要把 Enable 32-Bit Applications 設為 True 就行了
image

本以為這樣就結束了, 後來發現還有一些 Console Application 和 Windows Service 程式也有相同的問題, 雖然第一時間已經把原始程式找出來, 依上述的方式把 Platform target 從 Any CPU 改為 x86 重 Build 之後把問題解決了, 可是還是覺得很麻煩, 萬一沒有原始程式難道就無解了嗎? 當然不可能, 所以在問題解決之後, 又花了點時間找到了另一個不用重 build 的解決方法:

參考網址: http://www.request-response.com/blog/PermaLink,guid,cf345d71-cdc7-46b9-8c1c-eb21581a9222.aspx

簡單的說就是透過 .NET SDK 所提供的 corflags.exe 程式來改變 Assembly 的檔頭, 像底下這樣

corflags /32BIT+ yourAppName.exe

沒有留言: