0%

將程式編譯成 x86、x64、Any CPU差別在哪

相信用過 Visual Studio 的應該都注意過編譯時可以選擇 Any CPU、x86、x64 (x86、x64 需要編輯組態檔才會看的到)

/images/20190212/1.png

這次踩到問題是,明明程式用 Any CPU 來編譯,但在 64 bit OS 上卻會用 32 bit Process 來執行

/images/20190212/2.png

原來是因為專案建置的屬性勾到了 建議使用32位元的選項導致

/images/20190212/3.png

解決的同時也引起了對於編譯成 x86、x64、Any CPU 有什麼差別的好奇心,找了文章後整理如下


差異


在 32 bit OS 上執行

Any CPU : 會用 32 bit Process 來執行,可以載入 Any CPU 和 x86 方式編譯的組件,但如果載入 x64 編譯的組件將會引發 BadImageFormatException

Any CPU (勾選建議使用32位元) : 運作方式同上

x86 : 運作方式同上

x64 : 引發 BadImageFormatException


在 64 bit OS 上執行

Any CPU : 會用 64 bit Process 來執行,可以載入 Any CPU 和 x64 方式編譯的組件,但如果載入 x86 編譯的組件將會引發 BadImageFormatException

Any CPU (勾選建議使用32位元) : 會用 32 bit Process 來執行,可以載入 Any CPU 和 x86 方式編譯的組件,但如果載入 x64 編譯的組件將會引發 BadImageFormatException

x86 : 運作方式同 Any CPU (勾選建議使用32位元)

x64 : 運作方式同 Any CPU


Machine Config

依據執行的 Process 位元決定

32 bit Process 吃的 Machine Config 位置 : C:\Windows\Microsoft.NET\ Framework \v4.0.30319\Config

64 bit Process 吃的 Machine Config 位置 : C:\Windows\Microsoft.NET\ Framework64 \v4.0.30319\Config


怎麼查是用哪種方式編譯的?

可以透過 CorFlags.exe 的工具來查詢,該程式放在 C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools 路徑底下,設定為環境變數後就可以用 command 來檢視 PE

1
$ corflags yourPE.exe

PE : Process Executables (EXEs and DLLs)

/images/20190212/4.png

意義如下

/images/20190212/5.png

(圖片節錄至 : https://stackoverflow.com/questions/18608785/how-to-interpret-the-corflags-flags/23614024#23614024)