x86? x64? 傻傻分不清楚...

2008/07/23 .NET

雖然常在 x86 / x64 兩種模式下打轉,不過一不留神還真的會吃到虧... 最近平常下班跟工作都碰到 x64 的問題,因此這裡記一下心得,免的以後又吃到虧... 這篇又是無聊的碎碎唸 + 流水帳,沒耐心的人就直接跳過去吧 :D

 

除非你的程式非得用 C/C++ 不可,否則想要平順的從 x86 跨到 x64 的環境,最簡單的方式還是用 .NET。不過別以為你用 .NET 然後編譯的 PLATFORM 選 ANY CPU 就可以高枕無憂,好戲現在才開始...。

 

碎碎唸的內容太雜了,先列個摘要:

  1. 16 位元到 32 位元 v.s. 32 位元到 64 位元
  2. x64 + wow
  3. 同時使用 x86 only COM / x64 only COM

 

過去從 16 位元模式轉到 32 位元模式的路我沒有經歷過,雖然我寫過 16 bits 的程式,不過大都是像俄羅斯方塊,或是貪吃蛇之流的小程式,寫爽的... 也沒怎麼在用,跟本沒有轉移的問題。DOS時代我一直撐著,沒怎麼在用 WIN 3.1,後來 IBM OS/2 出來我有認真的用了一下,直到 Win95 的年代才開始真正在用 Windows...

不過 Windows 95 用了沒多久,實在受不了它的穩定性 (之前被 OS/2 慣壞了),就直接跳到 NT4 workstation,從此就一路一直用 NT 家族的作業系統 ( NT4、2000、XP... ),大部份時間都是窩在 32 位元的環境下作業。

 

Microsoft 替 32 -> 64 鋪的路,跟 16 -> 32 不大一樣。16 -> 32 靠的是 v86 mode 來提供 16 位元的相容模式,在 windows 下則是以 wowexec 把所有的 16 位元成式集中在這個 process 下執行。不過到了 32 -> 64 的年代,提供相容環境的作法已經不一樣了,直接在 user mode 下提供相容的模式,唯一的限制是同一個 process 不能同時存在兩種模式的 code,要嘛 32 要嘛 64,一定要選邊站就是了。只要你不碰到 COM 這類 in-process 的程式,都不會有太大的問題。

另外系統的目錄也開始分兩份...。安裝過 64 位元版的 windows 就知道,Program Files目錄變成兩個 ( Program Files / Program Files (x86) ),而 System32 目錄也變兩個了 ( System32 / SysWow64 ),其它像是 Registry 等也都有兩份...。

 

談談我碰過的幾個案例,工作上碰到的例子很多,其實自己寫的都是 script / assembly,都不大需要跟平台榜在一起。不過寫過 ASP / VB 的都知道,拿掉 COM 元件的話,大概就什麼都不剩了... 只要你需要的 COM 元件有一個沒有提供 64 位元版,很抱歉... 你就要乖乖回到 32 位元模式...。像 JET / ODBC driver 就沒有 64 位元版...。不過 .NET 倒是得天獨厚,因為有類似 Java VM 的 CLR 擋在 .NET 及 OS 之間,因此絕大部份的 .NET 2.0 程式碼都可以自在的跨 x86 / x64 兩種模式執行,除了... 除了我碰到的情況之外 -_-。

 

討厭的是這些自己寫的 .NET / SCRIPT 程式,沒有特別指定的話當然都會用原生的 64 位元模式執行,直到出錯你找半天找不到問題,無意之間才想到是 32/64 的鳥問題...,害我抓最久的就是 .NET 包裝的 SMTP 元件,CDO 沒有提供 64 位元版,但是 .NET 編譯成 ANY CPU 模式卻又沒有任何問題,直到執行時才給你 run time error ...。另一個例子是我自己在用的 WPF Image Codec... 因為我有用到 CANON 提供的 RAW CODEC,但是 CANON 遲遲不肯推出 64 位元版... Orz,我只好將就著點在 Vista x64 下跑 32 位元的版本。第一步就是重新 compile 自己寫的 Media Filer,通通編譯成 x86 platform。

 

程式看起來跑的好好的,不過問題現在才開始。家裡大人常愛用相機拍 AVI 下來,原本的程式是叫用 Media Encoder 把 AVI 重新編碼程我要的規格。32位元下呼叫 CSCRIPT.exe, 然後再叫用 WMEnc.vbs 出來轉檔... 才發現問題大條了,怎麼找不到元件? @_@

 

我一直以為 Microsoft 的東西,64位元版都會一次安裝兩種版本... 結果原來要個別去抓 32 / 64 位元的 Media Encoder 9 回來裝才能用... 好,硬碟就花下去,裝兩種就裝兩種...。執行過後又發現怪怪的,透過 media encoder components 啟動 media encoder 轉檔,怎麼轉完就停在 100% 不會自動關掉? 實在是搞不定,試了 64 位元版的沒問題,只好想辦法改用 64 位元版的 media encoder ...。

 

它ㄨ的,問題一個接著一個來... 弄到這裡才發現,32 位元模式下的程式,沒辦法叫 64 位元版的 COM 元件來幫我做事,Orz... 如果換 64 位元的話,又用不到 Canon Raw Codec ...。最後沒辦法,只好程式大搬家,拆成幾個獨立的 .exe,各自用適合的版本運作... 以功能來說,這樣已經達成我的目的了。正好並行效果不大好的 Canon Raw Codec,在這樣的模式下還能吃掉四核CPU的80%運算能力,算是偷笑了... 這篇雜七雜八的 x64 / x86 大亂鬥就到這裡為止,謝謝觀賞 :D。

 

image






Facebook Pages

Edit Post (Pull Request)

Post Directory