本章内容:
- .NET Framework部署目标
- 将类型生成到模块中
- 元数据概述
- 将模块合并成程序集
- 简单应用程序部署(私有部署程序集)
2.1 .NET Framework部署目标
1、Windows多年来一直因为不稳定和过于复杂而口碑不佳,要归咎于几方面的原因:
①所有应用程序都使用来自Microsoft或者其他厂商动态链接库(Dynamic-Link Library,DLL)--DLL hell。
②安装的复杂性。大多数应用程序在安装时会影响到系统的全部组件。
③涉及安全性。应用程序安装时会带来各种文件,其中许多是由不同的公司开发的。此外,Web应用程序经常会悄悄下载一些代码(比如ActiveX控件),用户根本注意不到自己的机器上安装了这些代码。
2、.NET Framework正在尝试彻底解决DLL hell的问题,还在很大程度上解决了应用程序状态在用户硬盘中四处分散的问题。如:类型不再需要注册表中的设置。
2.2 将类型生成到模块中
1、csc.exe /out:program.exe /t:exe /r:MSCorLib.dll Program.cs
csc.exe /out:Program.exe /t:exe Program.cs
cse.exe Program.cs
2、响应文件:是包含一组编译器命令行开关的文本文件。执行CSC.exe时,编译器打开响应文件,并使用其中包含的所有开关。在命令行中,在@符号之后指定相应文件的名称。例如:假定响应文件MyProject.rsp包含以下文本:
/out:MyProject.exe
/target:winexe
为了让CSC.exe使用这些设置,调用方式如下:
csc.exe @MyProject.rap CodeFile1.cs CodeFile2.cs
2.3 元数据概述
1、托管的PE文件由4部分构成:PE32(+)头、CLR头、元数据以及IL。
2、元数据是由几个表构成的二进制数据块。有三种表:定义表(definition table)、引用表(reference table)、清单表(manifest table)。
常用的元数据定义表包括:ModuleDef、TypeDef、MethodDef、FiledDef、ParamDef、PropertyDef、EventDef。
编译器编译源代码时,代码定义的任何东西都会导致定义表中创建一个记录项,此外,编译器还会检测源代码引用的类型、字段、方法、属性和事件,并创建相应的元数据表记录项。在创建的元数据中包含一组引用表,它们记录了所引用的内容。
常见的引用元数据表:AssemblyRef、ModuleRef、TypeRef、MemberRef。
2.4 将模块合并成程序集
1、程序集(assembly):是一个或多个类型定义文件及资源文件的集合。在程序集的所有文件中,有一个文件容纳了清单(manifest),清单也是一个元数据集合,表中主要包含作为程序集组成部分的那些文件的名称。还描述了程序集的版本、语言文化、发布者、公开导出的类型以及构成程序集的所有文件。
2、CLR操作的是程序集。CLR总是首先加载包含“清单”元数据表的文件,再根据“清单”来获取程序集中的其他文件的名称。
3、程序集的重要特点:程序集定义了可重用的类型;程序集用一个版本号标记;程序集可以关联安全信息。
4、使用程序集将可重用类型的逻辑表示与物理表示分隔开来。使用多文件程序集的三点理由:
①不同的类型用不同的文件,使文件能以“增量”方式下载。另外,将类型划分到不同的文件中,可以对购买和安装的应用程序进行部分或分批打包/部署。
②可在程序集中添加资源或数据文件。
③程序集包含的各个类型可以用不同的编程语言来实现。
清单元数据表:AssemblyDef、FileDef、ManifestResourceDef、ExportedTypesDef。
2.5 简单应用程序部署(私有部署的程序集)
1、在应用程序基目录或者子目录部署的程序集成为私有部署的程序集(privately deployed assembly),这是因为程序集文件不和其他任何应用程序共享---原来我一直以来部署的都是私有部署的程序集哦。
2、每个程序集都用元数据注明了自己引用的程序集,不需要注册表设置。引用程序集限定了每个类型的作用域,也就是说,一个应用程序总是和它生成和测试时的类型绑定。
3、以私有方式部署程序集,可以对程序集的命名、版本和行为进行最全面的控制。