• .NET中的程序集(Assembly)


    参考:http://blog.sina.com.cn/s/blog_7ade159d0102wmg9.html

    • 程序集(Assembly,装配件,.NET程序集)
      • 程序集是应用程序的部署单元,.NET应用程序包含一个或多个程序集。
      • 通常编译出来的dll、exe的.NET可执行程序都是程序集
      • .NET程序集包含元数据,这些元数据描述了程序集中定义的所有类型及其成员的信息,即方法、属性、事件和字段。
        • ildasm.exe这种反编译工具用到了?
      • 与命名空间比较
        • 程序集
          • 类库的物理组织形式
          • 通过右击reference添加引用来引入外部库
          • 目的:程序的物理组织,供CLR使用,这些exe、dll中包含一些程序集信息
        • 命名空间
          • 类库的逻辑组织形式
          • 通过using语句来引入外部库
          • 目的:避免产生类名冲突,人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象
        • 只有同时指定类型所在的命名空间及实现该类型的程序集,才能完全限定该类型。
        • 在一个程序集中可以有不同的命名空间,同一个命名空间也可以分布在多个程序集上。命名空间只是类型名的一种扩展,它属于类型名的范畴。
    • 每个project(如果是library,编译后生成一个对应的dll或exe)都会有一些程序集信息(显示在dll或exe的右击属性菜单中)
    • 作用:通过特性(Attribute)来设置程序集(dll文件)的常规信息,供查看或作为配置信息供程序内部使用
    • 对应到VS的项目树中,每个project->Properties->AssemblyInfo.cs文件中都包含了对应的这些程序集信息(一些Attribute)
      • 这个名为AssemblyInfo.cs的文件是vs在.net工程的Properties文件夹下自动生成的,一般情况下我们很少直接改动该文件。
      • using System.Reflection;
        using System.Runtime.CompilerServices;
        using System.Runtime.InteropServices;
        
        // General Information about an assembly is controlled through the following
        // set of attributes. Change these attribute values to modify the information
        // associated with an assembly.
        [assembly: AssemblyTitle("TestWinform")]
        [assembly: AssemblyDescription("")]
        [assembly: AssemblyConfiguration("")]
        [assembly: AssemblyCompany("Licence Owner")]
        [assembly: AssemblyProduct("TestWinform")]
        [assembly: AssemblyCopyright("Copyright © Licence Owner 2018")]
        [assembly: AssemblyTrademark("")]
        [assembly: AssemblyCulture("")]
        
        // Setting ComVisible to false makes the types in this assembly not visible
        // to COM components.  If you need to access a type in this assembly from
        // COM, set the ComVisible attribute to true on that type.
        [assembly: ComVisible(false)]
        
        // The following GUID is for the ID of the typelib if this project is exposed to COM
        [assembly: Guid("1d2f88e5-afc7-468d-a71b-078e27edf595")]
        
        // Version information for an assembly consists of the following four values:
        //
        //      Major Version
        //      Minor Version
        //      Build Number
        //      Revision
        //
        // You can specify all the values or you can default the Build and Revision Numbers
        // by using the '*' as shown below:
        // [assembly: AssemblyVersion("1.0.*")]
        [assembly: AssemblyVersion("1.0.0.0")]
        [assembly: AssemblyFileVersion("1.0.0.0")]
        View Code
    • 我们实际上通过另一个形式操作该AssemblyInfo.cs文件。那就是通过在鼠标右键点击项目的属性进入“应用程序”->“程序集信息”,然后修改信息。
    • 程序中如何读取assembly特性
      • Type t = typeof(Program);

        AssemblyProductAttribute productAttr = t.Assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), true)[0] as AssemblyProductAttribute;

        Console.WriteLine(productAttr.Product);

      • System.Reflection.Assembly.GetExecutingAssembly()
    • 注意
      • [assembly:AssemblyProduct("")] 特性不限于在AssemblyInfo.cs文件中使用,而是可以在任何的.cs文件中使用。
      • 对于同一个特性,程序集中仅能设置一次,否则编译时将报错。
    • 举例
      • [assembly:log4net.Config.XmlConfigurator(Watch=true)] 其实就是配置log4net框架从哪里读配置文件而已,当然这句也可以写到AssemblyInfo.cs文件中统一管理。
  • 相关阅读:
    [From 3.1~3.4]
    [From 2.7]简单应用程序部署(程序集打包)
    [From 2.4]C#编译器和程序集链接器(以及一些它们的命令开关)
    [From 2.3]托管PE文件的组成
    [From 1.1~1.2]CLR的执行模型
    项目开发日志:Build AssetBundle——SpriteAtlas(已解惑)
    JDK所有版本下载链接
    Maven
    SEO优化
    Mysql字符集
  • 原文地址:https://www.cnblogs.com/wyp1988/p/9923454.html
Copyright © 2020-2023  润新知