CLR对程序集的解释是:程序集是一个或多个类型定义文件及资源文件的集合。平时我们常见的后缀为dll或exe的文件其实就是一个程序集。为程序集添加资源文件,比如说常见的为一个Winform桌面程序添加一个自己的特色图标,可以在Visual Studio中选择项目”属性”,然后在”应用程序”选项卡中添加资源文件。
嵌入图标后,应用程序的可执行文件便会显示自己特有的图标。
在Jeffrey Richter的《CLR via C#》中,程序集分为弱命名程序集和强命名程序集。这两种程序集在结构上完全一致,都有着相同的PE文件格式、PE32(+)头、CLR头、元数据、清单表以及IL。两者的区别在于,强命名程序集使用发布者的公钥/私钥对进行了签名,唯一性地标识了程序集的发布者。一个强命名的程序集具有4个重要attributes,这些attributes共同对程序集进行唯一性标识:一个文件名(不计扩展名)、一个版本号、一个语言文化(culture)标识以及一个公钥(其实是一个从公钥派生的哈希值,称为公钥标记public key token)。例如:
"MyType, Version=1.0.0.0, Culture=neutral, PublicKeyToken=499eadeddab65c4d"。注意一点,我们无法根据"程序集标识字符串"来判断文件扩展名。
讨论程序集,有一个概念必须知道的,那就是全局程序集缓存(Global Assembly Cache, GAC)。对于.NET3.5和以前的版本,GAC一般位于以下目录:C:\Windows\assembly;对于.NET4.0,GAC位于以下目录:C:\Windows\Microsoft.NET\assembly。不要将自己的程序集文件手动复制到GAC目录下,因为GAC目录是结构化的,包含许多子目录,子目录的名称是通过特定算法生成的。还要注意的是,弱命名程序集是不能放到GAC中的。