CLR 支持两种程序集:弱命名程序集(weakly named assembly)和强命名程序集(strongly named assembly)
程序集可采用两种方式部署:私有和全局
弱命名程序集只能以私有方式部署
强命名程序集部署即可私有又全局。
强命名程序集具有4个重要特性:文件名(不计扩展名),版本号,语言文化,公钥
例如:"MyTypes,Vesion=1.0.8123.0,Culture=neutral,PublicKeyToken=b77a5c561934e89"
注意:可利用辅助类 System.Reflection.AssemblyName 轻松构造程序集名称,并获取程序的各个组成部分
由于弱命名程序集总是私有部署,所以CLR在应用程序基目录和子目录(具体子目录由XML配置文件的Probing元素的PrivatePath特性指定)中搜索程序集文件时只使用程序集名称(添加.dll和.exe扩展名)
弱命名程序集除了有文件名,程序集版本号和语言文化,还有发布私钥进行了签名
创建强命名程序集第一步是用.Net Framework SDK和Microsoft Visual Studio随带的Strong Name实现程序(SN.exe)获取密钥;
为了生成公钥和私钥对,运行SN.exe: SN -k MyCompany.snk 这告诉SN.exe创建MyCompany.snk 文件。文件中包含二进制形式的公钥和私钥。
要生成和以前版本的.NET Framework 兼容的程序集,还必须AssemblySignaturekeyAttribute创建联署签名(counter-signature)
详情参看:https://msdn.microsoft.com/zh-cn/library/hh415055(v=vs.110).aspx
注意,SN.exe 实用程序未提供任何显示私钥的途径
编译程序集时使用/keyfile:<file>编译器开关: csc /keyfile:MyCompany.snk Program.cs ;C#编译器看到这个开关会打开指定文件(MyCompany.snk),用私钥对程序集进行签名,并将公钥嵌入清单。
注意只能对含有清单的程序集文件进行签名;程序集其他文件不能被显示签名。
使用LsDasm.exe查看新程序集的元数据。
全局程序集缓存(Global Assembly Cache,GAC)
GAC 的具体位置是一种实现细节,不同版本会有所变化。但一般能在以下目录发现它:%systemRoot%micorsoft.NetAssmbly
开发和测试时在GAC中安装强命名程序集最常见的工具是GACUtil.exe。
延迟签名
准备打包自己的强命名程序集时,必须使用受严密保护的私钥对它进行签名。然而,开发和测试程序集时,访问这些受严密保护的私钥可能有点碍事儿。有鉴于此,.net Framework 提供了延迟签名(delayed signing)的支持。