3.1 节 两种程序集,两种部署
CLR 支持两种程序集:弱命名程序集(weakly named assembly,即无签名的程序集) 和 强命名程序集(strongly named assembly,即带签名的程序集)。
两者程序集结构完全相同。两者区别在于,强命名程序集使用发布者的公钥/私钥进行了签名。这一对密钥允许对程序集进行唯一性的标识、保护和版本控制,并允许程序集部署到用户机器的任何地方,甚至可以部署到Internet上。
程序集有两种部署方式:私有和全局。
[1] 私有部署:部署到应用程序基(根)目录或者某个子目录的程序集。
[2] 全局部署:全局部署是指部署到一些公认位置的程序集。
CLR 在查找程序集时,会检查这些位置。
注意:
[1] 弱命名程序集只能以私有方式部署;强命名程序集既可私有部署,也可全局部署。
[2] 私有部署中的子目录分两种:一是基目录下建与程序集文件同名的目录(极少数程序集可用,因为每个程序集对应一个子目录);二是子目录由 XML 配置文件的 probing 元素的 privatePath 特性指定(可将多个程序集文件指定到一个子目录)。
3.2 节 为程序集分配强名称
强命名程序集具有四个重要特性,共同组成唯一性标识:文件名(不计扩展名)、版本号、语言文化、公钥。由于公钥数字很大,所以常用从公钥派生的小哈希值,公钥标记(public key token),即公钥的64位哈希值的最后8个字节。程序集标识字符串(程序集显示名称),实例如下:
"System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"
注:可使用 System.Reflection.AssemblyName 构造程序集名称,并获取程序集名称的各个组成部分。标识的程序集文件可为 .exe 或 .dll 文件。
在 VS 中新建公钥/私钥文件,右键项目 → 属性 → 签名 → 勾选“为程序集签名(A)” → 然后从“选择强名称密钥文件”选择框中选择“<新建...>”。
3.3 节 全局程序缓存
全局部署的公认位置就是全局程序集缓存(Global Assembly Cache, GAC)。GAC的具体位置不同版本会有所变化。,一般在 " %SystemRoot%Microsoft.NETAssembly "。
GAC 目录是结构化的:其中包含许多子目录,子目录名称用算法生成。永远不要将程序集文件手动复制到 GAC 目录;相反,要用工具完成这项任务。工具知道GAC的内部结构,并知道如何生成正确的子目录名。可用 GACUtil.exe 。
3.4 在生成的程序集中引用强命名程序集
安装.NET Framework 时,实际会安装 Microsoft 的程序集文件的两套拷贝。一套安装到编译器/CLR