程序集是.NET用于部署和配置单元的术语。编程
程序集是自我描述的安装单元,由一个或多个文件组成。程序集能够是包括元数据的DLL或EXE(如 图1),它也能够是由多个文件组成,例如,资源文件、模块和EXE(如 图2)。缓存
程序集能够是私有或共享的。私有程序集或者位于应用程序所在的同一个目录下,或者位于其子目录中。共享程序集安装在全局程序集缓存(global assembly cache,GAC)中。GAC容许共享系统上同一个程序集的不一样版本。编辑器
附属程序集是只包含资源的程序集,它尤为适用于本地化。工具
使用工具ildasm能够查看程序集。spa
什么是程序集?插件
一般扩展名是EXE或DLL的.NET可执行程序称为程序集。调试
程序集和本地DLL或EXE有什么区别?code
他们的文件扩展名虽然相同,但.NET程序集包含元数据,这些元数据描述了程序集中定义的全部类型及其成员的信息,即方法、属性、事件和字段。正是由于.NET程序集包含了元数据,才致使他与本地DLL与EXE的不一样,因此说,元数据才是描述程序集的最基础数据。元数据是一种描述数据的数据。orm
什么是程序集清单?对象
它是元数据的一部分,描述了程序集和引用它所须要的全部信息,并列出了它所拥有的依赖关系。
清单的组成:
- 标识(名称、版本、文化和公钥)。
- 属于该程序集的文件列表。一个程序集能够包含一个文件(如图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)。
![]()