[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute


剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

【博主】反骨仔    【原文】http://www.cnblogs.com/liqingwen/p/5944391.html

 

  

  之前,我們通過《C# 知識回顧 - 特性 Attribute》已經了解如何創建和使用特性 Attribute,這次,讓我們一起來看看每次使用 VS 創建項目時所自帶的文件 AssemblyInfo.cs。

 

目錄

 

AssemblyInfo.cs

隨機挑選一個 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 的早期版本,若要使用強名稱的程序集執行以下程序集級別特性:

    ①AssemblyKeyFileAttribute

    ②AssemblyKeyNameAttribute

    ③AssemblyDelaySignAttribute

  雖然現在仍支持,但是,給程序集簽名的首選方法是使用“簽名頁”。(這里不深入了解)

 

二、已過時的特性:Obsolete

    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 特性執行方法依賴於預處理標識符。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 內部塊標明。

 

四、調用方信息特性

  使用調用方信息屬性,可以獲取關於調用方的信息傳遞給方法。可以獲取源代碼、行號在源代碼和調用方的成員名稱的文件路徑。

  若要獲取成員調用方信息,請使用適用於可選參數的屬性。每個可選參數指定默認值。

 

 1     internal class Program
 2     {
 3         private static void Main(string[] args)
 4         {
 5             CallerMethod();
 6             Console.Read();
 7         }
 8 
 9         public static void CallerMethod()
10         {
11             TraceMessage("我是調用者");
12         }
13 
14         public static void TraceMessage(string msg,
15             [CallerMemberName] string name = "",
16             [CallerFilePath] string filePath = "",
17             [CallerLineNumber] int lineNumer = 0)
18         {
19             Trace.WriteLine($"{nameof(msg)}: {msg}");
20             Trace.WriteLine($"{nameof(name)}: {name}");
21             Trace.WriteLine($"{nameof(filePath)}: {filePath}");
22             Trace.WriteLine($"{nameof(lineNumer)}: {lineNumer}");
23         }
24     }

  每次調用 CallerMethod 方法時,調用方信息將替換為可選參數的變量。

 

  1.備注

  你必須為每個可選參數指定顯式默認值。不能將調用方信息特性應用於未指定為可選的參數。

  調用方信息特性不會使參數成為可選參數。相反,它們會在忽略此參數時影響傳入的默認值。

  在編譯時,調用方信息值將作為文本傳入中間語言 (IL)。與異常的 StackTrace 特性的結果不同,這些結果不受模糊處理的影響。

  你可顯式提供可選參數來控制調用方信息或隱藏調用方信息。

 

傳送門

  《C# 知識回顧 - 特性 Attribute

  《C# 知識回顧 - 序列化

  《C# 知識回顧 - 表達式樹 Expression Trees

 

 



【參考】微軟官方文檔



 


免責聲明!

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



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