生成、打包、部署和管理应用程序及类型
《CLR via C#》第二章:生成、打包、部署和管理应用程序及类型
.NET Framework部署目标
所有应用程序都使用来自Microsoft或其他厂商的动态链接库DLL,导致DLL hell。
大多数应用程序在安装时会影响到系统的全部组建,安装和卸载时可能会有残留。
应用程序安装会带来由不同公司开发的文件,如ActiveX控件,它们可能下载一些代码来执行任何操作,这会带来安全性问题。
将类型生成到模块中
使用csc.exe指示C#编译器生成可执行文件。
csc.exe /out:Program.exe /t:exe /r:MSCorLib.dll Program.cs
响应文件是包含一组编译器命令行开关的文本文件。
csc.exe @MyProject.rsp CodeFile1.cs CodeFile2.cs //指定响应文件
元数据描述
元数据是由几个表构成的二进制数据块。包含三种表,分别为定义表、引用表和清单表。
常见的定义表:
ModuleDef, TypeDef, MethodDef, FiledDef, ParamDef, PropertyDef, EventDef
常见的引用表:
AssemblyRef, ModuleRef, TypeRef, MemberRef
可以使用ILDasm.exe即IL Disassembler(IL反汇编器)查看源数据表。
将模块合并成程序集
程序集是一个或多个类型定义文件及资源文件的集合。
CLR操作的是程序集,总是先加载包含清单元数据表的文件,再根据清单来获取程序集中其他文件的名称。
程序集的特点:
- 程序集定义了可重用的类型
- 程序集用一个版本号标记
- 程序集可以关联安全信息
程序集的优势:
- 不同的类型使用不同的文件,可以以增量方式下载,对应用程序进行分批/部分的打包/部署
- 可在程序集中添加资源或数据文件
- 程序集包含的各个类型可以用不同语言实现。
程序集是进行重用、版本控制、应用安全性设置的基础单元。
VS中,利用解决方案选项,当前项目可以引用同一个解决方案中另一个项目创建的程序集。
同样可以使用程序集链接器AL.exe来创建程序集。也可以用AL.exe生成只含资源的程序集,即附属程序集。
程序集版本资源信息
对于VS项目,会在Properties文件夹中自动创建AssemblyInfo.cs文件。
程序集中的三个版本号:
- AssemblyFileVersion:
仅供参考,CLR不检查也不关心,可在Windows资源管理器中查看,根据它识别程序集版本号。 - AssemblyInformationalVersion:
仅供参考,CLR不检查也不关心,指出包含该程序集的产品的版本。 - AssemblyVersion:
存储与AssemblyDef清单元数据表中,是程序集的唯一性标识。CLR在绑定到强命名程序集时会使用。
语言文化
程序集将语言文化作为身份标识的一部分。
未指定具体语言文化的程序集称为语言文化中性。
简单应用程序部署(私有部署的程序集)
在应用程序基目录或者子目录部署的程序集称为私有部署的程序集(privately deployed assembly),该程序集文件不和其他任何应用程序共享。
简单管理控制(配置)
为了实现对应用程序的管理控制,可在应用程序目录放入一个配置文件。CLR会解析文件内容来更改程序集文件的定位和加载策略。