代码改变世界

3.1 两种程序集,两种部署

2011-11-28 11:32  iRead  阅读(265)  评论(0编辑  收藏  举报

  CLR支持两种程序集:弱命名程序集(weakly named assembly)强命名程序集(strongly named assembly)

重要提示:任何.NET Framework文档中都找不到“弱命名程序集”这个术语,这是我自造的一个术语。事实上,文档中没有相应的专业术语来表示一个弱命名的程序集。通过自造一个术语,我在说到不同种类的程序集时就不会产生任何歧义。

  弱命名程序集和强命名程序集在结构上完全一致。也就是说,它们使用的是和第1章和第2章讨论的相同的PE文件格式、PE32(+)头、元数据、清单表以及IL。生成它们的工具也是相同的,都是C#编译器或者AL.exe。两者真正的区别在于,强命名程序集使用发布者的公钥/私钥对进行了签名,它唯一性地标识了程序集的发布者。这一对密钥允许对程序集进行唯一性的标识、保护和版本控制,并允许程序集部署到用户机器的任何地方,甚至可以部署到Internet上。由于程序集被唯一性地标识,所以当一个应用程序试图绑定到一个强命名的程序集时,CLR可以应用一些已知安全的策略。本章将解释强命名程序集以及CLR向其应用的策略。

  一个程序集可以采用两种方式来部署:私有或全局。“私有部署的程序集”是指部署到应用程序基目录或者一个子目录中的程序集。弱命名程序集只能以私有方式部署。第2章已讨论了私有部署的程序集。“全局部署的程序集”是指部署到一些已知位置的程序集;CLR在查找程序集时,会查找这些位置。强命名程序集既可以私有部署,也可以全部部署。本章将解释如何创建和部署强命名程序集。表3-1总结了程序集的种类及其部署方式。

  表3-1 弱命名和强命名程序集的部署方式

程序集种类 可以私有部署吗 可以全局部署吗
弱命名
强命名

注意:强烈建议对自己的所有程序集进行强命名。事实上,CLR未来的版本可能要求所有程序集都是强命名的,创建弱命名程序集的能力可能会被废弃(deprecated)1。弱命名程序集之所以会成为问题,是因为几个不同的程序集可能具有相同的弱名称。另一方面,为程序集分配一个强名称,可唯一性地标识程序集。如果CLR能唯一性地标识一个程序集,就可向其应用更多的版本控制或向后兼容策略。Microsoft计划为未来版本的CLR赋予这些策略,从而简化版本控制。事实上,只需阻止创建弱命名程序集,就能简化我们对CLR的版本控制策略的理解。


  1、表示因为推出一种新的功能,所以一种旧的功能不在推荐使用,后续的版本则可能彻底放弃对旧功能的支持,应使用新功能来保持与后续版本的兼容性。