一.概念介紹
一般來講,能影響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的程式集。這一點一定要注意。
參考文章:
Visual Studio .NET "目標平台" 說明
查看DLL檔案的屬性,版本 平台 x86? x64? Any CPU?
visual studio 調試需要pdb檔案
Visual Studio 64位應用程式編譯
組建組態