第二章 生成、打包、部署和管理应用程序及类型
-
.NET Framework部署目标
- DLL hell: 安装新应用程序时破坏另一个安装好的程序
- 安装的复杂性:安装时涉及复制文件、注册表、快捷方式等,除了使用安装程序以外很难直接复制程序
- 安全性:代码可以执行任何操作,比如删除文件、发送电子邮件等
-
响应文件:包含一组编译器命令行的文本文件
-
元数据:由几个表构成的二进制数据块
- 定义表:模块的标识、类型、方法、字段、参数、属性、事件等
- 引用表:代码引用的类型、字段、方法、属性和事件等
- 清单表:程序集中的资源清单、public类型清单等
-
作者推荐使用多文件程序集
-
将模块合并成程序集的方法
- 使用C#编辑器
- 使用程序集链接器(AL.exe)
-
在PE文件中嵌入版本资源信息(windows资源管理器中详细信息显示的各种版本信息)
-
程序集的身份标识中还包括语言文化(区域性)
-
私有程序集的部署(安装)
- 直接复制文件(运行时在应用程序目录查找引用的程序集)
- 打包成MSI文件等,实现程序集按需安装
- 使用VS的功能发布应用程序
-
简单管理控制(配置)
使用配置文件(XML),比如指定当前文件夹中查找不到程序集时,在哪个文件夹中查找
第三章 共享程序集和强命名程序集
- 私有部署和全局部署:私有是程序集部署到应用程序的基目录或子目录;全局是部署到公认位置
- 强命名程序集使用公钥/私钥进行签名,可以进行全局部署
- 程序集的强名称:由文件名、版本号、语言文化(Culture)、公钥(公钥的最小哈希)组成
- 创建强命名程序集
- 获取密钥(SN.exe)
- 编译器用私钥对程序集进行签名,将公钥嵌入清单
- 部署强命名程序集:放入公认的位置全局程序集缓存(GAC)(用工具放入,不要手动复制进去)
- 引用强命名程序集
- 指定了完整路径
- 只有文件名,按顺序在 工作目录、CSC目录、/lib编译器指定目录、LIB环境变量目录
- 不在GAC中查找,因为GAC的结构未知,无法指定路径
- CSC还可以指定字符串如 “Name,Version=xxx,Culture=xxx, PubKeyToken=xxx”
- 防篡改:用私钥签名后,检查文件哈希值与公钥解除签名后的值是否一致
- 延迟签名:开发时只使用公钥,但不用私钥签名(但是记录项中仍然有正确的公钥)
- CLR查找类型
- 类型在当前文件中
- 类型在当前程序集中,在另一个文件中
- 类型在另一个文件,另一个程序集中
- 版本控制:使用配置文件,指定程序集版本号,程序集更新后,修改配置文件CLR即可加载新的程序集;此处的修改,可使用配置文件自动进行(安装更新后的程序集时,自动修改配置文件)