轉載:http://blog.sina.com.cn/s/blog_78b94aa301014i8r.htmlhtml
今天有項目的代碼收到客戶的反饋,要求全部的EXE工程的目標平臺所有指定成x86,而全部DLL工程的目標平臺所有指定成AnyCPU 。操作系統
下面咱們一塊兒看看這個目標平臺有什麼做用,各選項有什麼差異吧。htm
在VisualStudio中,在編譯設置中有以下選項:blog
x86: 將程序集編譯爲由兼容 x86 的 32 位公共語言運行庫運行。進程
x64: 將程序集編譯爲由支持 AMD64 或 EM64T 指令集的計算機上的 64 位公共語言運行庫運行。get
anycpu:(默認值)將程序集編譯爲在任意平臺上運行。io
Itanium: 將程序集編譯爲由採用 Itanium 處理器的計算機上的 64 位公共語言運行庫運行。編譯
具體行爲以下:程序
在 64 位 Windows 操做系統上:im
用 x86 編譯的程序集將在 WOW64 下運行的 32 位 CLR 上執行。
用 x64 編譯的程序集將在 64 位 CLR 上執行。
用 anycpu 編譯的可執行文件將在 64 位 CLR 上執行。
用 anycpu 編譯的 DLL 將在與加載它的進程相同的 CLR 上執行。
在 32 位 Windows 操做系統上:
用 x86或anycpu 編譯的程序集將在 32 位 CLR 上執行。
用 x64 編譯的程序集沒法運行。
搞清楚這些差別之後,回過頭來看看客戶要求的東西,有沒有道理吧。
首先有一點是知道的,客戶但願程序可以在WINXP以上的各系統中運行(無論是32位仍是64位)。
所以,不可能選x64,Itanium這種針對特殊處理器的也不會去選。
那都選擇Any CPU這種默認方式有沒有問題呢?
首先看看Any CPU和x86的可執行文件(EXE)在32位和64位下有什麼區別吧,
Any CPU在32位下,EXE將以32位執行,而在64位下,EXE將以64位執行。而x86的話,始終以32位執行。
客戶但願使用的x86,也就是不但願64位下用64位方式執行EXE程序。我分析的緣由是因爲系統中可能存在第三方的32位DLL,一旦使用64位執行的EXE,在調用到32位的DLL時,將沒法調用。
而DLL,客戶則但願採用Any CPU,我分析的緣由是DLL的實際運行方式是受調用它的EXE所影響的,所以設爲Any CPU就能夠了。而若是設定爲x86,雖然看似沒什麼問題,但其沒法在64位CLR中運行了,不是太好。
參考資料:
http://msdn.microsoft.com/zh-cn/library/zekwfyz4(VS.80).aspx
------------------------------
補充一下,可使用.NET SDK中提供的CorFlags命令查看程序集的目標平臺,也能夠修改它,這樣就能夠不用從新編譯了。不過,爲啥64位下的EXE沒法調用32位的DLL呢?