相信用過 Visual Studio 的應該都注意過編譯時可以選擇 Any CPU、x86、x64 (x86、x64 需要編輯組態檔才會看的到)
這次踩到問題是,明明程式用 Any CPU 來編譯,但在 64 bit OS 上卻會用 32 bit Process 來執行
原來是因為專案建置的屬性勾到了 建議使用32位元
的選項導致
解決的同時也引起了對於編譯成 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)
意義如下
(圖片節錄至 : https://stackoverflow.com/questions/18608785/how-to-interpret-the-corflags-flags/23614024#23614024)