這次我們來聊聊Winform編譯中的那些屬性設置,也算對這部分知識的一個梳理。
內容概覽
- Debug/Release、Platform不同設置的內部差別
- 常規設置
- 錯誤和警告
- 將警告視為錯誤
- 輸出
- 高級設置
1.Debug/Release、Platform不同設置的內部差別
在使用Visual Studio的過程中,工具欄上面的Build欄是我們常常開啟顯示而不怎么去關注的一個地方。
左邊的Debug/Release模式主要決定了項目編譯的時候/optimize和/debug對應的值。
當我們使用Debug進行編譯的時候,設置分別為/optimize-和/debug:full。
而當使用Release模式進行編譯的時候,對應的設置分別為/optimize+和/debug:pdbonly。
- /optimize選項主要決定了C#編譯器對生成的代碼是否進行優化,如IL代碼和JIT本地代碼。當關閉優化的時候,編譯器生成的代碼會包含一些NOP(空操作)指令和一些分支指令以便於調試之用,而開啟優化的時候,控制流程被優化,生成的EXE/DLL也更小。
- /debug選項只有在+/full/pdbonly模式時才會生成一個PDB(Program Database)文件以幫助調試器查找局部變量並將IL指令映射到源代碼。
而Platform的選擇主要決定了編譯出的程序運行平台的差異。
我們在Any CPU下拉的配置管理頁面中可以看到如下選項。
Itanium(安騰)是Intel的一個IA-64(Intel Architecture 64)架構處理器。x64即64位平台,x86即32位平台。
當我們選擇32位編譯時會在程序集上包含一個PE32的頭,而64位編譯會添加一個PE32+的頭,比較如下。
所以我們一般發布版本時選擇Release+Any CPU的模式進行編譯,而知道了這些編譯配置還遠遠不夠,我們再看看VS提供的更豐富的配置。
2.常規設置
我們在項目上右鍵選擇屬性或者使用快捷鍵ALT+ENTER打開屬性頁面,切換到Build選項。
我們先來看常規設置的部分。
首先我們看條件編譯符號的三個配置:一個自定義和兩個自帶的DEBUG和TRACE。
我們的測試代碼如下。
2 {
3 #if (parry_debug)
4 Console.WriteLine( " parry_debug 已經定義 ");
5 #else
6 Console.WriteLine( " parry_debug 沒有定義 ");
7 #endif
8
9 #if DEBUG
10 Console.WriteLine( " 這里是調試信息 ");
11 #endif
12
13 #if TRACE
14 Console.WriteLine( " 這里是跟蹤信息 ");
15 #endif
16
17 Console.WriteLine( " 這里是正常的功能代碼... ");
18 Console.Read();
19 }
使用條件編譯可以很方便的編譯出不同邏輯的程序,編譯調試和跟蹤代碼運行。
在上面的代碼中,定義了一個自定義的符號parry_debug並使用了它,還測試了DEBUG和TRACE的使用。
這是都勾選並填寫上自定義符號的運行結果,自定義的符號支持多個,值以逗號隔開填寫。
這是三個選項都關閉的運行情況,我想你應該能看懂這三個配置的用途了。
Platform的選擇和是否優化代碼的前面已經提到過了,就不再說了。
是否允許不安全代碼這決定了是否可以在代碼里使用unsafe的代碼,可以使用下面的代碼測試。當關閉的時候,下面的代碼是不能編譯通過的。
2 {
3 /// <summary>
4 /// 程序入口地址
5 /// </summary>
6 /// <param name="args"> 參數數組 </param>
7 unsafe static void Main( string[] args)
8 {
9 #if (parry_debug)
10 Console.WriteLine( " parry_debug 已經定義 ");
11 #else
12 Console.WriteLine( " parry_debug 沒有定義 ");
13 #endif
14
15 #if DEBUG
16 Console.WriteLine( " 這里是調試信息 ");
17 #endif
18
19 #if TRACE
20 Console.WriteLine( " 這里是跟蹤信息 ");
21 #endif
22
23 int i = 5;
24 SquarePtrParam(&i);
25
26
27 Console.WriteLine( " 這里是正常的功能代碼... ");
28 Console.Read();
29 }
30
31 /// <summary>
32 /// Square this parameter
33 /// </summary>
34 /// <param name="p"></param>
35 unsafe static void SquarePtrParam( int* p)
36 {
37 *p *= *p;
38 }
39 }
3.錯誤和警告
此設置定義了編譯時提示出來的警告的級別,從0~4,4最高:提示所有的警告,0不提示任何警告。
具體的定義如下:
而取消警告,這是針對上面的選擇,剔除掉不想顯示的警告,填入對應的錯誤代碼號即可。
如CS3009這樣的等等,所有的錯誤和警告代碼看這:MSDN錯誤和警告代碼定義。
4.將警告視為錯誤
這一條值得說一說,有句話叫“警告即錯誤”,我們在開發時一般勾上All選項進行編譯,強制所有的警告都當成錯誤,必須都解掉才能編譯通過。
當讓你也可以像上面的選擇設置一樣,跳過某些的確不需要去關注的警告case號。
或者就是默認的關閉此功能。
我們建議默認選上All,使得自己的代碼更加健壯與完美。
5.輸出
輸出路徑在多項目自動編譯的時候會使用到,可以實現一次編譯將需要編譯出來的文件都整理到一個地方去,而不需要到一個個項目的BIN文件夾去拿。
勾選上XML文檔文件后,代碼中的注釋內容都將以XML文件的形式編譯出來,在后來你做自己項目類庫的Help文件的時候會很有用,當作為類庫給別人使用的時候,別人在VS里調用的時候也能很好地看到你的注釋。
注冊 COM 互操作:指示托管應用程序將公開一個 COM 對象(可調用 COM 的包裝),以使 COM 對象可以與托管應用程序進行交互。必須將此應用程序“項目設計器”的應用程序頁中的“輸出類型”屬性設置為“類庫”,才能使“為 COM 互操作注冊”屬性可用。有關可以包含在 Visual C# 應用程序中並公開為 COM 對象的示例類,請參見COM 類示例(C# 編程指南)。
生成序列化程序集:指定是否為程序集中的類型創建XML序列化程序集,主要用於改進 XmlSerializer 在序列化或反序列化指定類型的對象時的啟動性能。
6.高級設置
關於高級設置的部分,因為很少用到,可以參照MSDN里面的詳細解釋。
會偶爾用到的可能是檢查算法上溢/下溢:指定不在 checked 或 unchecked 關鍵字范圍內並且產生的值超出數據類型范圍的整數算法語句,是否會導致運行時異常。