私有程序集:私有程序集是一种简单的程序集类型,一般附带在某些软件上,且只能用于该软件。系统可以保证私有程序集不被其他软件使用,因为应用程序只能加载位于主执行文件所在文件夹或其子文件夹中的程序集。有程序集要求放置在客户端应用程序所在目录(应用程序目录)或者其子目录下。
私有程序集的全标识包括有好名称和数字版本号,两者都被记录在程序集清单中。好友名称就是模块名称减去文件扩展名。
共享程序集:共享程序集是其它应用程序公共使用的类库。单个程序集可以为多个应用程序服务,而不要将程序集(PE)文件Copy到引用程序运行目录下。必须有提供一个目录来存放共享程序集文件,而这个目录成为:全局程序集缓存(GAC)。它通过全局程序集缓存工具(gacutil.exe)进行安装,卸载和显示共享程序集。既然有一个目录来存放共享Dll文件,那个必然会遇到这样的问题,多个应用程序同时共享一个Dll文件,一旦更新此Dll文件时,其中某些程序就会崩溃,即所谓的“Dll地狱”。程序集比较完美地解决这个问题。此部分涉及到程序集的强命概念。一个共享程序集并不部署在使用它的应用程序目录中。相反,共享程序集安装在GAC。GAC是在Windows目录下名为Assembly的子目录中(例如:C:\windows\Assembly).
强名称:在部署程序集到GAC前,必须赋予它一个强名称。强名称用于标识给定.NET二进制文件的发行者。强名称有一组相关数据组成。我们可以使用程序集级别的特性来定义其中的大部分数据。为了给一个程序集赋予强名称,首先需要使用.NET Framework 4 SDK的sn.exe工具生成公钥/私钥对。sn.exe工具生成一个文件[通常以*.snk(Strong Name Key)作为文件扩展名],该文件包含两个不同的但算术上相关的钥:公钥和私钥。一旦C#编译器确定.snk文件的位置,它就会在编译过程中使用.publickey标记把公钥值记录到程序集清单里。另外,C#编译器还会产生一个基于整个程序集(CIL代码、元数据等)的散列值。散列码是对于某一固定输入的独一无二的数值输出。因此,如果更改了.NET程序集的内容(就算只是改变一个字符),编译器将产生完全不同的散列码。散列码结合*.snk文件中私钥组成数字签名,并把它嵌入到程序集的CLR首部数据中。
两者区别:两者的本质区别在于共享程序集的一个副本可供一台机上的多个应用程序使用。将代码库部署为私有还是共享,仍然是一个需要权衡的问题。它取决于项目本身的细节。一般来说,如果构建的库可被大量应用程序使用,共享程序集将十分有帮助,因为你可以轻松地部署一个新的版本。