1. .NET框架部署目标
部署三问题:
所有程序都会使用来之微软和其他厂商的DLL,任何一段代码的程序员都不确定别人是怎么使用这段代码的;升级后可能出现“DLL Hell"。
安装过程复杂,复杂到多个文件夹,注册表被修改,快捷方式安装桌面,开始菜单,工具栏,是程序不能隔离成一个独立个体,难以备份,迁移,卸载,删除。
安全问题,允许和禁止其他公司的代码访问系统资源。
.NET 框架很大程度上解决了以上三个问题。
windows 安全验证是基于用户身份,而代码访问安全(code access security)是基于程序集的标示。
2. 将类型生成为模块
PE表头: windons 要求的标准信息。
CLR表头:包含元数据的版本信息,以及元数据表的大小与偏移量,入口方法的标记,可选的强命名数字签名。
元数据:实际上 一块二进制数据块,包含三类表(定义表,引用表,清单表)
定义表: ModuleDef(包含托管模块的条目,模块文件名与路径);TypeDef(包含所有类型,一些标记(pubic),指针(方法,熟悉));MethodDef(包含了所有方法,,一些标记(pubic),指向参数的指针);FieldDef(包含所有字段,一些标记,字段类型);ParamDef(包含所有参数,一些标记(out,in)); PropertyDef(所有属性);EventDef(每个事件);
引用表:AssemblyRef(记录每个引用的程序集,程序集名称,版本号,公钥,语言文化); ModuleRef(托管模块中引入同一程序集内的不同模块);TypeRef,MemberRef;
3. 将模块组合成程序集
CLR 总是最先加载元数据文件清单表,利用清单表找到其他文件。
程序集的特性:程序集定义了可重用的类型; 标示有一个版本号;可以包含与 之有关的安全信息;
引入程序集的原因:实现了分离可重用类型的逻辑表示与物理表示,例如可用将一些不常用的类型放到一个文件中,这样下载时没有使用就可以不下载。
配置CodeBase元素指定需要下载的程序集文件。
使用多文件程序集的原因:可以将类型分别实现在不同的文件中,实现增量下载;可以按需要向程序集中添加资源或者数据文件;可以包含不同语言创建的module。
清单表:AssemblyDef;FieldDef; ManifestResourceDef(资源);ExportdtTpeDef(公有类型);
清单表为程序集的使用者与其各部分提供了一层间接联系,实现自描述。(注意:包含清单的文件知道程序集中的其他文件,但其他文件不知道他们是程序集的一部分)
4. 程序集版本资源信息
版本号格式:主版本号,次版本号,生成版本号,修订版本号。
一个程序集三个版本号:
AssemblyFileVersion(存在win32版本资源中,仅辅助信息,CLR不查用);AssemblyInformationVersion(存在win32版本资源中,仅辅助信息,CLR不查用);AssemblyVersion(存储在元数据清单表AssemblyDef中);
5. 语言文化
和版本号一样,语言文化也是程序集标示中的一部分,例如,我们可能有一个德语的程序集,一个英语的程序集等等
6. 简单应用部署
前面讲的是如何生成程序集,下面介绍一下如何组合一个程序集。
打包方式:直接拷贝;打包成MSI文件;
私有部署程序集: 和应用程序部署在同一目录的程序集(程序集带有CLR运行需要的信息,不需要设置注册表或者活动目录)
COM的类型是记录在注册表中。
7. 简单管理控制(配置)
通过配置文件配置。