强命名 (strong name) 由一个
程序集的标识组成并通过
公钥和
数字签名(针对该程序集生成)加强的名称,其中的标识包括程序集的
简单文本名称、版本号和区域性信息(如果提供的话)。
因为不同的公司可能会开发出有相同名字的
程序集来,如果这些程序集都被复制到同一 个相同的目录下,最后一个安装的程序集将会代替前面的程序集。这就是著名的Windows “
DLL Hell”出现的原因。
很明显,简单的用文件名来区分
程序集是不够的,
CLR需要支持某种机制来唯一的标识一个程序集。这就是所谓的强命名
程序集。
一个强命名
程序集包含四个唯一标志程序集的特性:文件名(没有扩展名),版本号,语言文化信息(如果有的话),公有秘钥。
如果一个公司想唯一的标识它的程序集,那么它必须首先获取一个
公钥/
私钥对,然后将共有秘钥和程序集相关联。不存在两个两个公司有同样的
公钥/
私钥对的情况,正是这种区分使得我们可以创建有着相同名称,版本和语言文化信息的程序集,而不引起任何冲突。
与强命名
程序集对应的就是所谓的弱命名程序集。(其实就是普通的没有被强命名的
程序集)。两种
程序集在结构上是相同的。都使用相同的PE文件格式,,以及清单(manifest)。二者之间真正的区别在于:强命名
程序集有一个发布者的
公钥/
私钥对签名,其中的
公钥/私钥对唯一的标识了程序集的发布者。利用公钥/
私钥对,我们可以对
程序集进行唯一性识别、实施安全策略和
版本控制策略,这种唯一标识程序集的能力使得应用程序在试图绑定一个强命名程序集时,CLR能够实施某些“已确知安全”的策略(比如只信任某个公司的程序集)。
如果你是
开源开发人员且希望利用强命名程序集的标识优势,不妨签入与源代码管理系统内程序集相关联的
私钥。