關於Winform編譯配置那些事


這次我們來聊聊Winform編譯中的那些屬性設置,也算對這部分知識的一個梳理。

內容概覽

  1. Debug/Release、Platform不同設置的內部差別
  2. 常規設置
  3. 錯誤和警告
  4. 將警告視為錯誤
  5. 輸出
  6. 高級設置

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。

我們的測試代碼如下。

 1  static  void Main( string[] args)
 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的代碼,可以使用下面的代碼測試。當關閉的時候,下面的代碼是不能編譯通過的。

 1  static  class Program
 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 關鍵字范圍內並且產生的值超出數據類型范圍的整數算法語句,是否會導致運行時異常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM