【茶包射手日記】只能跑 32 位元的 AnyCPU .NET 程式

測試某個 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 通吃。

又上了一課~

歡迎推文分享:
Published 23 October 2017 07:29 AM 由 Jeffrey
Filed under: ,
Views: 5,787



意見

沒有意見

你的看法呢?

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

5 + 3 =

搜尋

Go

<October 2017>
SunMonTueWedThuFriSat
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

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

文章典藏
其他功能

這個部落格


Syndication