1. 两种程序集,两种部署方式
私有部署:能够方便的控制程序集的命名,版本,行为;
全局部署:多个应用程序共同访问程序集;
强命名程序集与弱命名程序集的区别:强命名程序集有一个发布者的公钥私钥对签名,其中公钥私钥对唯一标示了发布者,实施安全策略与版本策略。
2. 强命名程序集
一个强命名的程序集包含了唯一特性:程序集名称,版本号,语言文化,公钥标记。
可以通过System.Reflection.AssemblyName,获取CultureInfo,FullName,KeyPair,Name,Version。
强命名工具:SN.EXE
强命名处理: 先对PE进行散列码处理, CLR表头 加 RSA数字签名;AssemblyDef清单中加公钥标记。
3. 全局程序集缓存(GAC内部结构)
全局程序集缓存(GlobalAssemblyCache,GAC) 通常在c:\windows\Assembly\GAC目录下,便于多个调用的应用程序查询到。
GAC是一个结构化目录,包含很多由特定算法产生的子目录。
采用GACUtil.exe工具,将强命名程序集添加到GAC中。
4. 引用强命名程序集
一份程序集拷贝到CLR目录(方便我们生产自己的程序集),一份拷贝到GAC目录(方便运行时加载这些程序集文件)
相应文件(response file)是一组包含编译器命令行开关的文件。
5. 强命名程序防篡改特性
散列+私有密钥
6. 延迟签名
当我们打包强命名的程序集是,需要使用安全的私钥来前面;在开发测试阶段,需要推迟签名。
使用公钥签名(不能防止篡改),但是具备共享程序集的作用。
7. 强命名程序集的私有部署
使用codebase ,不被鼓励,原因是没有那个程序可以控制强命名程序集的何时卸载。
8. 并存执行
CLR能够将文件名相同但存放路径不同的程序集加载到同一地址空间,这是并存技术(Side by Side),是解决(DLL hell)的关键技术。
优势:不需要兼容旧版本,快速推出新版本。
注意:避免并存机制带来的诡异bug;当一个应用程序加载一个版本的程序集后,为其开辟了一块内存空间,而另外一个程序加载了另外一个版本的程序集后,使用的还是第一个程序集开辟的内存空间。
9. CLR 如何解析类型引用
CLR 在三个地方之一找到该类型:
同一文件:在编译时就确定下来了,是早绑定( early bound)
不同文件,同一程序集:确保文件在当前程序集清单FileDef表内,加载并检查其散列值确保文件完整,之后查找类型。
不同文件,不同程序集:加载包含被引用程序集的清单所在文件,如果不包含,CRL则根据清单文件加载适当的文件,找到类型。
10. 高级管控制(配置)
配置文件:
probing 元素:指定基目录下路径查找弱命名程序集。(强命名程序是codebase,并在GAC)
configuration 工具。
发布者策略:
-- 忽略发布者策略
<publisherPolicy alppy=“no”>
bindredirect oldVersion newversion
11. 修复错误的应用程序
当控制台程序或者windows窗体程序正在一个用户账户下运行时,CRL会保持一个应用程序实际加载程序集的记录(asp.net,xml 服务没有记录),这些加载信息被累积在内存中,并在程序结束后写入磁盘目录:
其中UserName 是该用户账户。
目录中的ini文件,是应用程序的快照,默认5个快照。
.Net Application Restore RollBackBlock