私有部署和全局部署
强命名程序集私有部署和全局部署都可以,非强命名程序集则只可以私有部署。
非强命名程序集的私有部署(简单拷贝部署)
和应用程序部署在同一个目录下的程序集称作私有部署程序集。私有部署给程序员带来方便。安装(复制),移动,卸载(删除)都很简单。
简单管理控制(配置)
可在应用程序目录下安放一个配置文件,CLR通过解析该文件内容来改变其定位和加载程序集时的策略。如app.exe.config
强命名程序集的私有部署
如果不太可能被共享,强命名程序集应该用私有部署。
强命名程序集的全局部署
如果一个程序集要被多个应用程序访问,那么必须放在一个CLR确知的目录内,这个已知的目录称作全局程序集缓存(GAC),通常在C:/Windows/Assembly/GAC
在开发和测试时,向GAC安装强命名程序集最常用GACUtil.exe
在发布时,因为GACUtil.exe工具没有和面向终端的.NET框架分发包一起发布,所以必须使用2.0版本以上的windows安装器(MSI)
引用强命名程序集
编译时CSC.exe将在以下目录中查找程序集:
1. 当前工作目录
2. 编译器目前使用的CLR所在目录(与GAC中程序集中相同,两份拷贝),MSCorLib.dll总是包含在这目录内。一般在C:/windows/Microsoft.NET/Framework/v1.0.3427
3. 任何用CSC.exe的/lib命令行开关指定的目录。
4. 任何LIB环境变量中指定的目录。
CLR所在目录中的拷贝使得我们能够方便的生成自己的程序集。而GAC中的拷贝用于运行时加载这些程序集文件。
运行时CLR将在以下目录中查找程序集:
1. GAC中定位
2. 应用程序自基目录
3. 配置文件(XXX.exe.config)中标识的私有路径中查找
4. 如果用MSI安装,CLR将要求MSI定位程序集。
对程序集文件的签名过程
生成一个强命名程序集时,该程序集的FileDef清单文件数据表将包含该程序集所有文件的一个列表。每个文件的名称被加入时都被转换成一个散列值,该散列值与文件名一起存入FileDef
在生成有清单的PE文件后,该PE文件整个内容被转换为一个散列值(散列算法:SHA-1),再经由私有密钥签名,生成RSA数字签名存储在PE文件的一个保留区。
最后,PE文件的CLR表头被更新以反映数字签名在文件中的嵌入位置。另外公有密钥(完整的)嵌入PE文件的AssemblyDef文件清单中。
强命名程序集防篡改特性
当程序集被安装到GAC中时,系统将对包含清单的文件内容进行散列转换,然后与嵌入PE文件的RSA数字签名进行比较,若不同,则被篡改。另外系统还会对其他文件的内容进行散列转换,然后与清单文件中FileDef表内存储的散列值进行比较。
另:当强命名程序集是从非GAC的地方加载时,CLR会在程序集被加载时比较散列值,也就是说每次执行都会计算散列值。