第三章:共享程序集和强命名程序集

两种程序集,两种部署

  CLR支持两种程序集:强命名程序集和非强命名程序集(为了与前者对立,我们称为"弱命名程序集").这两种程序集在结构上完全一致,都是PE文件格式、PE32(+)头、CLR

头、元数据、清单表以及IL。区别:强命名程序集使用发布者的公钥/私钥对进行了签名,它唯一的标识了程序集的发布者。

  一个程序集可以采取两种方式来部署:私有或全局。”私有部署的程序集“是指部署到应用程序基目录或者一个子目录中的程序集。弱命名程序集只能以私有方式部署。”全局部署的

程序集“是指部署到一些已知位置的程序集,CLR在查找这些程序集时,会检查这些位置。强命名程序集既可以私有部署,也可以全局部署。

  一个公司要想唯一性的标识它的程序集,必须创建一个公钥/私钥对。然后,公钥可以同程序集关联。创建强命名程序集的方法

  使用SN.exe获取一个密钥:SN -k MyCompany.snk  含义为告诉SN.exe创建一个名为MyCompany.snk的文件,文件中包含二进制形式的公钥和私钥。

  一般而言,由于公钥是非常大的数字,而一个程序集可能引用其它大量程序集,所以在最终的生成文件中,相当一部分会被公钥信息占据,为了节省存储空间,microsoft对公钥

进行了哈希处理,并获取哈希值的最后八个字节。AssemblyRef表实际存储的是这种简化的公钥值(”成为公钥标记").我们看到的一般都是公钥标记,而不是完整公钥。

全局程序集缓存GAC

  如果一个程序集要由多个应用程序访问,则必须把它放到一个已知的目录中,而CLR在检测到对该程序集的一个引用时,能够自动检测该目录,这个已知的位置称为全局程序集

缓存。注意:永远不要手动将程序集文件复制到GAC目录;相反,应该使用工具(gacutil.exe)来完成这项任务。

posted @ 2012-12-16 13:08  Samguist  阅读(345)  评论(0编辑  收藏  举报