剖析 AssemblyInfo.cs - 瞭解常用的特性 Attribute 【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/5944391.html 序 上次,我們通過《C# 知識回顧 - 特性 Attribute》已經瞭解如何創建和使用特性 Attr ...
剖析 AssemblyInfo.cs - 瞭解常用的特性 Attribute
【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/5944391.html
序
上次,我們通過《C# 知識回顧 - 特性 Attribute》已經瞭解如何創建和使用特性 Attribute,這次,讓我們一起來看看每次使用 VS 創建項目時所自帶的文件 AssemblyInfo.cs。
目錄
核心代碼
展開圖中的代碼,看箭頭↓
using System.Reflection; using System.Runtime.InteropServices; // 有關程式集的常規信息通過下列特性集 // 控制。更改這些特性值可修改 // 與程式集關聯的信息。 [assembly: AssemblyTitle("MusicStore")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Microsoft")] [assembly: AssemblyProduct("MusicStore")] [assembly: AssemblyCopyright("Copyright © Microsoft 2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // 將 ComVisible 設置為 false 會使此程式集中的類型 // 對 COM 組件不可見。如果需要 // 從 COM 訪問此程式集中的某個類型,請針對該類型將 ComVisible 特性設置為 true。 [assembly: ComVisible(false)] // 如果此項目向 COM 公開,則下列 GUID 用於 typelib 的 ID [assembly: Guid("a9ef3281-9049-4a52-a2f1-2061d442200e")] // 程式集的版本信息由下列四個值組成: // // 主版本 // 次版本 // 內部版本號 // 修訂版本 // // 可以指定所有值,也可以使用“修訂號”和“內部版本號”的預設值, // 方法是按如下所示使用 "*": [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]
一、全局屬性
大多數特性適用於特定的語言元素(如類或方法),但是,有些屬性是全局它們適用於整個程式集或模塊。如:AssemblyVersionAttribute 屬性可用於向程式集中嵌入版本信息。
全局特性在源代碼中出現在任何頂級 using
指令以及任何類型、模塊或命名空間聲明之前。全局特性可顯示在多個源文件,但是,在單一編譯傳遞必須編譯文件。在 C# 項目中,它們在 AssemblyInfo.cs 文件中。
程式集特性是提供有關程式集的信息的值。它們分成以下類別:
①程式集標識特性
②信息性特性
③程式集清單特性
④強名稱特性
1.程式集標識特性
三個特性 (使用強名稱,如果適用) 確定程式集的標識:名稱、版本和區域性。當在代碼中引用時,這些特性構成程式集的完整名稱需要。使用特性,可以將程式集的版本和區域性。但是,名稱值由編譯器,在 “程式集信息”對話框 的 Visual Studio IDE 設置,創建程式集後,根據包含程式集清單的文件。AssemblyFlagsAttribute 特性指定程式集的多個副本是否可以共存。
圖 - “程式集信息”對話框
圖 - “程式集信息”對話框中的名詞和 AssemblyInfo.cs 文件的對應關係
2.信息性特性
您可以使用信息性特性為程式集提供其他的公司或產品信息。
3.程式集清單特性
可以使用程式集清單特性提供程式集清單中的信息。其中包括標題、說明、預設別名和配置。
4.強名稱特性(不深入)
一般存在 Visual Studio 的早期版本,若要使用強名稱的程式集執行以下程式集級別特性:
雖然現在仍支持,但是,給程式集簽名的首選方法是使用“簽名頁”。(這裡不深入瞭解)
二、已過時的特性
Obsolete
屬性指示某個程式實體標記為建議不再使用的一個。 每次使用對實體標記為過時根據隨後將生成警告或錯誤,配置屬性。
1 /// <summary> 2 /// 舊類 3 /// </summary> 4 [Obsolete("請使用 " + nameof(NewClass))] 5 class OldClass 6 { 7 public void Method() { } 8 } 9 10 /// <summary> 11 /// 新類 12 /// </summary> 13 class NewClass 14 { 15 [Obsolete("請使用 " + nameof(NewMethod), true)] 16 public void OldMethod() { } 17 18 public void NewMethod() { } 19 }
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var oldClass = new OldClass(); //警告 6 7 var newClass = new NewClass(); 8 newClass.OldMethod(); //報錯 9 } 10 }
在此示例中應用 Obsolete
特性類 OldClass 和方法 NewClass.OldMethod
。此構造函數的第一個參數為警告或錯誤的信息,由於特性構造函數的第二個參數被應用於 NewClass.OldMethod
設置為 true
,此方法將導致編譯器錯誤,而使用 OldClass 只將生成警告的類。
三、條件特性
Conditional
屬性執行方法依賴於預處理標識符。Conditional
屬性是 ConditionalAttribute 的別名,可應用於方法或屬性類。
在此示例中,Conditional
應用於方法以啟用或禁用程式特定診斷信息示:
1 class Debug 2 { 3 [Conditional("DEBUG")] 4 public static void Output(string msg) 5 { 6 Console.WriteLine(msg); 7 } 8 } 9 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 Debug.Output("This is Debug!"); 15 Console.WriteLine("Done!"); 16 17 Console.Read(); 18 } 19 }
Conditional
屬性通常用於在 DEBUG
標識符啟用跟蹤,並記錄的功能的調試版本,但不在發佈版本中。
將之前的代碼簡單改動下,使用 #if…#endif 包扎,結果和上圖是一樣的。
class Debug { public static void Output(string msg) { Console.WriteLine(msg); } } class Program { static void Main(string[] args) { #if DEBUG Debug.Output("This is Debug!"); #endif Console.WriteLine("Done!"); Console.Read(); } }
使用 Conditional
更加整潔,當然也可以將平常不太到用到或者容易出錯的方法在 #if…#endif
內部塊標明。
四、調用方信息屬性
使用調用方信息屬性,可以獲取關於調用方的信息傳遞給方法。可以獲取源代碼、行號在源代碼和調用方的成員名稱的文件路徑。若要獲取成員調用方信息,請使用適用於可選參數的屬性。每個可選參數指定預設值。
傳送門
《C# 知識回顧 - 表達式樹 Expression Trees》
預覽版,待整理完畢後再發佈到首頁
【參考】微軟官方文檔