【写给自己的教程】.NET-程序集(一)
- 程序集的含义及相关概念
- 程序集的功能
- 程序集的结构
- 程序集的含义及相关概念
程序集是.NET用于部署和配置单元的术语。
程序集是自我描述的安装单元,由一个或多个文件组成。程序集可以是包括元数据的DLL或EXE(如 图1),它也可以是由多个文件组成,例如,资源文件、模块和EXE(如 图2)。
程序集可以是私有或共享的。私有程序集或者位于应用程序所在的同一个目录下,或者位于其子目录中。共享程序集安装在全局程序集缓存(global assembly cache,GAC)中。GAC允许共享系统上同一个程序集的不同版本。
附属程序集是只包含资源的程序集,它尤其适用于本地化。
使用工具ildasm可以查看程序集。
什么是程序集?
通常扩展名是EXE或DLL的.NET可执行程序称为程序集。
程序集和本地DLL或EXE有什么区别?
他们的文件扩展名虽然相同,但.NET程序集包含元数据,这些元数据描述了程序集中定义的所有类型及其成员的信息,即方法、属性、事件和字段。正是因为.NET程序集包含了元数据,才导致他与本地DLL与EXE的不同,所以说,元数据才是描述程序集的最基础数据。元数据是一种描述数据的数据。
什么是程序集清单?
它是元数据的一部分,描述了程序集和引用它所需要的所有信息,并列出了它所拥有的依赖关系。
清单的组成:
- 标识(名称、版本、文化和公钥)。
- 属于该程序集的文件列表。一个程序集可以包含一个文件(如图1),也可以包含多个文件(如图2)。
- 被引用的程序集列表。说明该程序集所使用的所有程序集。
- 许可请求。是指运行该程序集需要的许可。
- 导出的类型
什么是模块?
模块是没有程序集特性的DLL。因此模块不是程序集,因为他不包含程序集特性。
为什么要使用模块?
模块可以更快的启动程序集,因为并不是所有的类型都在一个文件中。模块只在需要时加载。
使用模块的另一个原因是多语言编程。一个模块用VB编写,另一个模块用C#编写,这两个模块可以包含在同一个程序集中。
程序集的特性:
当创建VS项目时,会自动生成源文件 AssemblyInfo.cs,可以使用一般的源代码编辑器配置程序集的特性。下面是从项目模板中生成的一个文件
using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Windows; // 有关程序集的一般信息由以下 // 控制。更改这些特性值可修改 // 与程序集关联的信息。 [assembly: AssemblyTitle("PEViewer")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("PEViewer")] [assembly: AssemblyCopyright("Copyright © 2018")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // 将 ComVisible 设置为 false 会使此程序集中的类型 //对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 //请将此类型的 ComVisible 特性设置为 true。 [assembly: ComVisible(false)] //若要开始生成可本地化的应用程序,请设置 //.csproj 文件中的 <UICulture>CultureYouAreCodingWith</UICulture> //例如,如果您在源文件中使用的是美国英语, //使用的是美国英语,请将 <UICulture> 设置为 en-US。 然后取消 //对以下 NeutralResourceLanguage 特性的注释。 更新 //以下行中的“en-US”以匹配项目文件中的 UICulture 设置。 //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] [assembly: ThemeInfo( ResourceDictionaryLocation.None, //主题特定资源词典所处位置 //(未在页面中找到资源时使用, //或应用程序资源字典中找到时使用) ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置 //(未在页面中找到资源时使用, //、应用程序或任何主题专用资源字典中找到时使用) )] // 程序集的版本信息由下列四个值组成: // // 主版本 // 次版本 // 生成号 // 修订号 // // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 // 方法是按如下所示使用“*”: : // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]
这个文件用于配置程序集清单。编译器读取程序集特性,把特定信息插入到程序集清单中。
assembly:前缀把特性标记为程序集级别特性。与其他特性不同,程序集级别的特性与特定的语言元素无关。
用于程序集特性的参数是名称空间 System.Reflection、System.Runtime.CompilerServices 和 System.InteropServices 中的类。
以下是程序集的特性列表:
表1
程序集的特性 说明 AssemblyCompany 指定公司名 AssemblyConfiguration 指定构建信息,例如零售或调试信息 AssemblyCopyright and
AssemblyTrademark包含版权和商标信息 AssemblyDefaultAlias 如果程序集名不容易理解(例如,动态创建程序集名时的GUID),就可以使用该特性指定别名。 AssemblyDescription 描述程序集或产品。如果查看可执行文件的属性,这个值就为显示为Comments AssemblyProduct 指定程序集所属产品的名称 AssemblyTitle 给程序集提供一个友好名称。该名称可以包含空格。使用文件属性时,该值显示为Description AssemblyCulture 定义程序集文化。这个特性对附属程序集很重要 AssemblyInformationalVersion 在引用程序集时,该特性不用于版本检查,仅用于版本信息.该特性适合用于指定多个程序集的应用程序的版本。使用文件属性时,该值显示为Product Version AssemblyVersion 给出程序集的版本号 AssemblyFileVersion 定义文件版本 可在VS中,项目属性->应用程序->配置程序集信息 来配置这些信息
- 程序集的功能
1.程序集是自描述的。程序集包含描述程序集的元数据。元数据包括从程序集导出的类型和一个清单。
2.程序集可以并行加载。所谓并行加载的意思就是,假设程序集A引用共享程序集的版本1,程序集B引用共享程序集的版本2,而用户同时引用程序集A和B,那么应用程序需要同时引用共享程序集的1和2两个版本,在.NET中应同时加载和使用两个版本。.NET 4 中允许一个进程中有多个CLR版本,这样就可以加载有不同CLR要求的插件。不过,在同一个进程的不同CLR版本中,对象之间没有直接通信的.NET方式,但是可以利用其他技术解决,如COM。
3.程序集的独立性。应用程序使用应用程序域来确保程序集的独立性。利用应用程序域,许多程序集(程序集原本就是DLL或EXE)可以独立地运行在同一个进程中。运行在一个应用程序域内的一个程序集错误不会影响同一个进程中另一个应用程序域的其他程序集。
4.安装简单。只需要复制一个程序集中的所有文件,一条xcopy命令就够了。这个特性称为ClickOnce部署。但在一些情况下不能进行ClickOnce部署,而需要正常的Windows安装。
- 程序集的结构
程序集由描述它的程序集元数据、描述导出类型和方法的类型元数据、MSIL代码和资源组成。所有这些部分都在一个文件中(见图1),或者分布在几个文件中(见图2)。