二进制组件允许我们将各个功能分解后单独发布,.NET中将这种类型的二进制组件称作程序集,在共享逻辑、跨语言以及组件部署方面,程序集为我们提供了很多简化和便利。
程序集在.NET中充当了组件包的角色,每个程序集都可以独立的发布和升级,制约我们升级一个程序集的因素是“如何尽量减少程序集之间的耦合”。
当程序启动时,CLR加载器并不会加载所有被引用的程序集,而是之用当CLR需要某个程序集中的元素时,才会去解析相关的引用,它会首先找到被引用的程序集,然后加载它,并JIT编译必要的IL代码。
程序集分为“强命名程序集”和“弱命名程序集”,其中“强命名程序集”包含:程序集的文本名称、版本号、语言文化以及共有密钥标记。而“弱命名程序集”只包含程序集的文本名称。
注意:1)只有强命名程序集才可以存储在GAC中;2)我们可以使用配置文件来改变应用程序中每个强命名程序集的默认行为;3)强命名程序集可以防止恶意的篡改,从而可以为应用程序提供更高的安全保障。
程序集的版本号由4部分组成:Major.Minor.Build.Revision,编译器可以自动生成Build版本号和Revision版本号,生成规则:Build版本号是自2000年1月1日以来的天数;Revision版本号是自午夜以来的秒数再除以2,这种算法可以保证每次编译出来的版本号都是唯一的。
在升级程序集时,我们需要保证升级前的组件接口中的公有成员和受保护成员要和升级后的组件在IL层次上保持兼容,即我们不能删除方法、不能修改参数和返回值。我们必须确保升级后引用该组件的所有其他组件不需要重新编译。