測試某個 COM+ 元件應用專案,開發者所附的範例專案測試成功,我自己新增 Console Application 或 Windows Form 專案則卡在找不到 Registry 無法執行。強烈懷疑與 x86/x64 有關,由於只有註冊 64 位元 COM+,專案跑 x86 找不到 Registry 是意料中事,但詭異之處在於我已確認過範例專案跟我新增的專案都是設 Any CPU 無誤,甚至放在同一個 Solution 測試,卻一個成功一個失敗。

實測將新增 WinForm 或 Console 專案平台目標(Platform Target)改為 x64 可排除問題,但無法解答為什麼範例專案設 Any CPU 可以,我卻得寫死 x64 才行的疑惑。

挖出 CorFlags 工具一探究竟,發現一個奇妙差異,有個沒學過的新旗標: 32BITPREF,我新增的專案被設為 1,範例專案則為 0。

有了這項新發現,重新檢查 Visual Studio 的專案設定,這才看出玄機,兩個專案都設定 Any CPU, 但範例專案沒勾選 Prefer 32-bit,我新增的專案有。

用關鍵字查詢,我學到了新知識。參考: Make sure "Prefer 32-bit" option is turned off for .NET 4.5 executables

原來這是 Visual Studio 2012 起針對 .NET 4.5 專案的新增選項,在新增 WinForm、WPF、Console 專案時,預設為 Any CPU + Prefer 32-bit。

AnyCPU + Prefer 32-bit 在 Windows 平台永遠跑 32 位元模式,跟平台目標設成 x86 的行為相同,唯一差別在於 AnyCPU + Perfer 32-bit 可以在 ARM 機器執行。參考: What AnyCPU Really Means As Of .NET 4.5 and Visual Studio 11

換句話說,AnyCPU + Prefer 32-bit 骨子裡根本是 x86,取消 Prefer 32-bit 後才是我原本想像的那個 32/64 都能跑的 AnyCPU。 下回看到 .NET 4.5+ 設定 AnyCPU 時,記得要確認沒有勾選 Prefer 32-bit,才代表 .NET 程式能 32/64 通吃。

又上了一課~


Comments

# by Ho.Chun

前幾天,我在玩 Crystal Report 時也遇到相同問題 XD

Post a comment