CorFlags.exe 是 .NET Framework SDK 附帶的命令列工具,專門用來**檢視**與**修改**組件標頭的 PE 格式、CorFlags 位元,進而判斷或改變組件的平台目標(Any CPU、x86、x64)。本文透過實測數據,詳細說明三種目標的 CorFlags 差異、如何用指令切換、以及不可逆的限制。
同一專案,分別設 Platform Target = Any CPU / x86 / x64 編譯,產生:
EventPingPongAny.exeEventPingPongX86.exeEventPingPongX64.exe| 欄位 | Any CPU | x86 | x64 | 說明 |
|---|---|---|---|---|
| Version | v2.0.50727 | v2.0.50727 | v2.0.50727 | CLR 版本(均為 .NET 2.0/3.5 執行階段) |
| CLR Header | 2.5 | 2.5 | 2.5 | CLR 標頭版本 |
| PE | PE32 | PE32 | PE32+ | **關鍵差異**:x64 為 64-bit PE 格式 |
| CorFlags | 1 | 3 | 1 | 位元組合:ILONLY(1) + 32BIT(2) + Signed(4)… |
| ILONLY | 1 | 1 | 1 | 純 MSIL,無非受控碼 |
| 32BIT | 0 | 1 | 0 | **核心旗標**:1=強制 32-bit(x86),0=不強制 |
| Signed | 0 | 0 | 0 | 是否強名簽名 |
corflags MyAssembly.exe
# 或
corflags MyAssembly.dll
corflags /32BIT+ MyAssembly.exe
執行後再次檢視,32BIT 變為 1,CorFlags 變為 3。組件現在只會以 32-bit 載入。
corflags /32BIT- MyAssembly.exe
32BIT 歸零,CorFlags 回到 1。
corflags /Force MyAssembly.exe # 強制更新(會移除簽名)
因為 **x64 組件的 PE 格式是 PE32+**(64-bit),而 Any CPU / x86 都是 **PE32**(32-bit)。CorFlags **無法修改 PE 格式**,只能翻轉 CorFlags 位元。因此:
corflags /32BIT+ 快速修正編譯產出的 Any CPU 組件,無需重建專案。/32BIT+,確保部署環境相容。corflags 即知是否需在 32-bit 模式運行。| 專案屬性 Platform Target | 產出 PE | 32BIT 旗標 | CorFlags 值 | 執行行為 |
|---|---|---|---|---|
| Any CPU | PE32 | 0 | 1 | 隨 OS 位元數 |
| Any CPU (Prefer 32-bit) VS2012+ 預設 | PE32 | 1 | 3 | 優先 32-bit,可在 ARM 裝置跑 |
| x86 | PE32 | 1 | 3 | 強制 32-bit |
| x64 | PE32+ | 0 | 1 | 僅 64-bit OS |
| ARM64 | PE32+ | 0 | 1 | 僅 ARM64 OS |
提示:Visual Studio 2012+ 預設啟用「Prefer 32-bit」,實際行為等同 x86(CorFlags=3)。若需真正 Any CPU(64-bit OS 跑 64-bit),請**取消勾選 Prefer 32-bit**。
corflags。C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.x Tools\CorFlags.exe掌握 CorFlags,就能在「不重新編譯」或「無原始碼」情況下,快速診斷與修正平台相容性問題,是 .NET 開發/運維工具箱裡的利器。