一.概念介紹
一般來講,能影響VS編譯結果的參數有兩個:編譯優化和目標平台
編譯優化
首先要明白一個概念,.Net是一個二次編譯模型,所以VS編譯的結果是IL代碼。而默認情況下VS編譯出來的IL代碼,會包括很多NOP指令(空指令),還包括許多分支指令等。VS會利用這些指令對程序調試操作提供更好的支持。而所謂的編譯優化,就是去掉這些額外的指令,讓程序集的體積和運行時所占的內存更小一點。
其它平時更常用的說法叫Debug版與Release版。Debug版就是關閉編譯優化的版本,Release版就是打開編譯優化的版本。
目標平台
現代操作系統分為32位與64位。32位操作系統可以運行32位程序,64位操作系統可同時運行32位與64位程序。操作系統通過識別程序文件的頭來判定程序的類別。如果包括一個PE32頭,則是32位程序,如果是PE32+頭,則是64位程序。VS的目標平台有3個選項,X86,X64和AnyCpu。如果選擇X86,則會在程序集的前面加上一個PE32頭,如果選擇X64則加上一個PE32+頭。而AnyCpu則有點特殊,它將程序集加上一個PE32頭,但是CLR會跟據運行環境自動調整JIT編譯器編譯出的目標機器碼。所以如果普通的靜態分析工具分析程序集文件會發現它是32位程序,但是運行時卻是64位程序。
通過Visual Studio command prompt下的corflags命令則可以確定程序集的實際類別。如果是X86編譯,PE:PE32,32BIT:1,如果是X64編譯,PE:PE32+,32BIT:0,如果是AnyCpu編譯,PE:PE32,32BIT:0。
二.在解決方案中設置編譯選項
可以在解決方案屬性頁中對所有項目提供基礎設定。
可以看到,在最上面一行有兩個參數分別對應上文所說的概念:配置和平台。這里的配置就是指是Debug模式還是Release模式,選項第一個活動(XXX)表示當前的選擇。平台則是表示X86,X64,還是部份X86部分X64混合着用,同樣選項里第一個活動(XXX)表示當前的選擇。右面的主面板里可以對每個項目進行單獨與詳細的設置。
這里有幾個需要注意的地方,我是經過多次探索才得出結論的。
1.可以看到,在界面上最上面一行有配置與平台選項,在右面主面板里每個項目又有自己的配置與平台選項。但它們所表達的意思是不同的。真正對項目編譯起作用的是主面板里的設置,而最上面的設置可以把它想像成主面板相對應設置集的一種編譯策略的名字。就如上圖所示,配置里選的是Debug,但主面板里有配置成Release模式的項目。舉個例子,你可以建一個名叫M的配置,M顯示在最上面的配置下拉框里,其中前三個項目是Debug模式,后兩個是Release模式,然后再建一個名叫N的平台,N將顯示在最上面的平台下拉框里,其中第一個是X86,后面四個是X64模式。
可以通過配置管理器按鈕來維護配置集與平台集。
2.直接通過最上面的上拉框是無法改變項目設置的。比如將上面的配置下拉框由活動(Debug)改成Release,當然你可以看到主面板里各個項目的設置確實都已改了。但是如果你點確定,然后再進入本窗口時,卻發現最上面的選擇仍然是先前的活動(Debug)。這里可以選讓你誤以為直接可以更改的原因,我猜是方便給你查看的。
3.更改設定會影響生成dll與exe的目錄。
平台 |
模式 |
目錄 |
AnyCpu,X86 |
Debug |
bin\Debug |
Release |
bin\Release |
|
X64 |
Debug |
bin\X64\Debug |
Release |
bin\X64\Release |
三.在項目中設置編譯選項
項目屬性頁里也可以對具體項目做配置與平台的設置。
可以看到,在最上面一行也有配置與平台的下拉框。如同上面所述一樣,這里也是只能看,不能改。
勾選優化代碼等同於選擇Release模式,也可在目錄平台下拉框更改平台選項。
在頁面最下面有一個高級按鈕,點開后會彈出如下框
這里最重要的就是調試信息了,點開下拉框后顯示如下:
這里只有選中full或pdb-only時才會生成pdb文件。pdb全稱Program Database,里面保存了IL代碼與源代碼的對應關系。只有在編譯時生成了此文件,源代碼才可調試。
四.要注意的問題
由上文可知,程序集的生成目錄是被解決方案屬性頁里的設置影響的,但實際的編譯模式卻可以被項目屬性頁更改。這會帶來目錄名與實際程序集類型不一致的問題。比如你在解決方案里設定為X64平台,但是在項目屬性頁里卻將其目標平台改為X86,結果就是在X64的目錄里生成了X86的程序集。這一點一定要注意。
參考文章: