剖析 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 特性指示某个程序实体标记为建议不再使用的一个。 每次使用对实体标记为过时根据随后将生成警告或错误。
     /// <summary>
/// 旧类
/// </summary>
[Obsolete("请使用 " + nameof(NewClass))]
class OldClass
{
public void Method() { }
} /// <summary>
/// 新类
/// </summary>
class NewClass
{
[Obsolete("请使用 " + nameof(NewMethod), true)]
public void OldMethod() { } public void NewMethod() { }
}
     class Program
{
static void Main(string[] args)
{
var oldClass = new OldClass();  //警告 var newClass = new NewClass();
newClass.OldMethod();  //报错
}
}

  在此示例中应用 Obsolete 特性类 OldClass 和方法 NewClass.OldMethod。此构造函数的第一个参数为警告或错误的信息,由于特性构造函数的第二个参数被应用于 NewClass.OldMethod 设置为 true,此方法将导致编译器错误,而使用 OldClass 只将生成警告的类。

三、条件特性:Conditional

  Conditional 特性执行方法依赖于预处理标识符。Conditional 属性是 ConditionalAttribute 的别名,可应用于方法或属性类。

  在此示例中,Conditional 应用于方法以启用或禁用程序特定诊断信息示:

     class Debug
{
[Conditional("DEBUG")]
public static void Output(string msg)
{
Console.WriteLine(msg);
}
} class Program
{
static void Main(string[] args)
{
Debug.Output("This is Debug!");
Console.WriteLine("Done!"); Console.Read();
}
}

  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 内部块标明。

四、调用方信息特性

  使用调用方信息属性,可以获取关于调用方的信息传递给方法。可以获取源代码、行号在源代码和调用方的成员名称的文件路径。

  若要获取成员调用方信息,请使用适用于可选参数的属性。每个可选参数指定默认值。

     internal class Program
{
private static void Main(string[] args)
{
CallerMethod();
Console.Read();
} public static void CallerMethod()
{
TraceMessage("我是调用者");
} public static void TraceMessage(string msg,
[CallerMemberName] string name = "",
[CallerFilePath] string filePath = "",
[CallerLineNumber] int lineNumer = )
{
Trace.WriteLine($"{nameof(msg)}: {msg}");
Trace.WriteLine($"{nameof(name)}: {name}");
Trace.WriteLine($"{nameof(filePath)}: {filePath}");
Trace.WriteLine($"{nameof(lineNumer)}: {lineNumer}");
}
}

  每次调用 CallerMethod 方法时,调用方信息将替换为可选参数的变量。

  1.备注

  你必须为每个可选参数指定显式默认值。不能将调用方信息特性应用于未指定为可选的参数。

  调用方信息特性不会使参数成为可选参数。相反,它们会在忽略此参数时影响传入的默认值。

  在编译时,调用方信息值将作为文本传入中间语言 (IL)。与异常的 StackTrace 特性的结果不同,这些结果不受模糊处理的影响。

  你可显式提供可选参数来控制调用方信息或隐藏调用方信息。

传送门

  《C# 知识回顾 - 特性 Attribute

  《C# 知识回顾 - 序列化

  《C# 知识回顾 - 表达式树 Expression Trees


【参考】微软官方文档

[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute的更多相关文章

  1. 修改AssemblyInfo.cs自动生成版本号

    一. 版本号自动生成方法 1.把 AssemblyInfo.cs文件中的[assembly:AssemblyVersion("1.0.0.0")]改成[assembly:Assem ...

  2. .Net魔法堂:AssemblyInfo.cs文件详解

    一.前言 .net工程的Properties文件夹下自动生成一个名为AssemblyInfo.cs的文件,一般情况下我们很少直接改动该文件.但我们实际上通过另一个形式操作该文件.那就是通过在鼠标右键点 ...

  3. AssemblyInfo.cs文件参数具体讲解

    在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的AssemblyInfo.cs文件的内容具体介绍 //是否符合公共 ...

  4. AssemblyInfo.cs文件的作用

    在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些參数,以下是默认的AssemblyInfo.cs文件的内容详细介绍 //是否符合公共 ...

  5. [0] AssemblyInfo.cs文件介绍

    AssemblyInfo.cs文件:包含程序版本.信息.版权的属性文件 先介绍AssemblyInfo.cs文件中的程序集属性 内容: using System.Reflection;using Sy ...

  6. WinForm中AssemblyInfo.cs文件参数具体讲解

    在.NET中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的AssemblyInfo.cs文件的内容具体介绍 //是否符合公共语言规 ...

  7. AssemblyInfo.cs文件详解

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq395537505/article/details/49661555 一.前言 .net工程的Pr ...

  8. C#——Visual Studio项目中的AssemblyInfo.cs文件包含的配置信息

    Visual Studio程序集项目中的AssemblyInfo.cs文件中的内容 using System.Reflection; using System.Runtime.CompilerServ ...

  9. c#程序中的AssemblyInfo.cs

    在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的AssemblyInfo.cs文件的内容具体介绍 //是否符合公共 ...

随机推荐

  1. SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]

    目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...

  2. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  3. 获取微软原版“Windows 10 推送器(GWX)” 卸载工具

    背景: 随着Windows 10 免费更新的结束,针对之前提供推送通知的工具(以下简称GWX)来说使命已经结束,假设您还未将Windows 8.1 和Windows 7 更新到Windows 10 的 ...

  4. [转]Patch文件结构详解

    N久不来 于是不知道扔在哪儿于是放这里先 如果你觉得碍事的话 帮我扔到合适的版块去.. 导读这是一篇说明文 它介绍了标准冒险岛更新文件(*.patch;*.exe)的格式文章的最后附了一段C#的参考代 ...

  5. input type='file'上传控件假样式

    采用bootstrap框架样式 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> &l ...

  6. 登录(ajax提交数据和后台校验)

    1.前台ajax数据提交 <form id="login_form" action="" method="POST"> < ...

  7. MFC中成员变量的声明顺序与析构顺序

    第一次用博客,第一篇随笔,就写今天遇到的一个问题吧. 在VS2008的MFC对话框程序,窗口成员变量的声明顺序与其析构顺序相反,即,先声明的变量后析构,后声明的变量先析构.未在其他模式下测试. cla ...

  8. StatePattern(状态模式)

    /** * 状态模式 * @author TMAC-J * 状态模式和策略模式很像,其实仔细研究发现完全不一样 * 策略模式各策略之间没有任何关系,独立的 * 状态模式各状态之间接口方法都是一样的 * ...

  9. 解决:SharePoint当中的STP网站列表模板没有办法导出到其它语言环境中使用

    首在在你的英文版本上,导出列表或是网站的模板,这个文件可能是这样滴:template.stp 把这个文件 template.stp 命名为 template.cab 解压 这个 *.cab 文件 在解 ...

  10. Linux字符设备驱动框架

    字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标.键盘.显示器.串口等等,当我们执行ls -l ...