2012年12月24日

如何知道.NET exe/dll的目標平台是32/64/Any CPU

當我們部署exe或DLL到64位元機器時,常會遇到一些問題,為了除錯可能會想要知道所部署的 EXE/DLL 是使用何種,在說明之前,先了解一下平台目標的意義。
目標平台可以從專案-屬性-建置,來做設定

image
它預設值是Any CPU,共以下幾種:
  • Any CPU: 這個模式表示所編譯的EXE/DLL在64位元平台(OS)就用64位元跑,32位元就用32位元跑
  • x86: 這個模式表示所編譯的EXE/DLL是以32位元模式 , 這除了可以在32位元OS跑之外,也可以在64位元OS跑,乃因64位元OS提供一種WOW64模式(這裡有一篇說的很好),可讓32bit的程式也可在64位元上模擬跑。
  • x64: 這個模式表示所編譯的EXE/DLL只能在64位元模式跑, 因此只能在64位元OS跑 
雖然有上面這麼多種方式,但對於Assembly的編譯事不影響,因為.net採用IL(中介碼),不同平台是在runtime時才JIT把IL編譯成該平台使用的Native code
了解了以上,我們利用適用vs2012 開發人員命令題示字元,輸入
corflags /?
image
列出說明,你就可以猜到這指令可以修改平台目標 接著輸入以下來看一下的exe/dll
corflags xx.dll [vs2012]
image
[vs2010]
image
32BITREF是針對EXE,1時表示在 64BIT平台跑32位元程式,dll如果設為1會發生錯誤
這邊只要看PE, 32BITREQ(vs2012)/32BIT(vs2010),其組合如下:
  PE 32BIT[REQ]
Any CPU PE32 0
x32 PE32 1
x64 PE32+ 0

參考

Corflags: http://msdn.microsoft.com/en-us/library/ms164699.aspx
Visual Studio: “Target CPU” setting in “Advanced Compiler Settings”. What does it do?
Visual Studio .NET Platform Target Explained
http://blogs.msdn.com/b/gauravseth/archive/2006/03/07/545104.aspx
使用dumpbin http://stackoverflow.com/questions/4216841/visual-studio-target-cpu-setting-in-advanced-compiler-settings-what-does-i

沒有留言:

張貼留言