第四部分:
创建二进制组件和创建类有很多相似之处:我们都在尝试区分和分割功能。它们的区别在于二进制组件可以用来描述那些离散的功能。我们可以创建组件程序集来实现简单的逻辑共享,跨语言编程和简单的程序发布。
在.Net中程序集是一个组件包。每个程序集都可以被独立的发布和升级。升级一个已发布程序集的简易程度取决于对程序集中最小化耦合的处理是否得当。最小化耦合意味着我们不仅仅要最小化程序集中复杂的依赖关系,还要考虑便于升级版本。这章的主要内容就是如何创建易于使用、发布和更新的程序集。
.Net的运行环境可以支持由多个二进制组件构成的程序集。我们可以独立更新其中的每一个。我们必须清楚CLR(公共语言运行库)是如何寻找和装载程序集的。在创建组件时我们必须遵循这种规则,否则就不能实现二进制组件的效果。下面的篇幅就是介绍这些的。
CLR装载器并不会在程序开始运行时就装载所有的程序集引用。而是在运行需要时再由装载器处理该程序集引用。这可能是由方法调用或者数据访问。装载器寻找程序集引用并装载,实时编译需要的IL。
当CLR需要装载一个程序集时,第一步时检测需要装载的文件。程序集的元数据中记录了它所有的引用。这些记录有强名称和弱名称之分。对于一个强名称程序集这种记录包含4个部分:程序集的名称,版本号,支持的区域性和公钥。对于非强名称程序集来说就只有程序集的名称。使用强名称可以减少被恶意组件替换的可能性。强名称让我们可以使用配置文件设置所需组件的版本。
在检测到正确的程序集名称和版本号之后,CLR会检测这个程序集是否已经被装载过。如果已经装载,那么就它就可以直接应用。否则CLR会继续寻找该程序集。如果该程序集是强名称的CLR首先在GAC(全局程序集缓存)中寻找。如果不在GAC中,装载器会检查配置文件中指定的文件夹。如果这个文件夹存在,那么只在这个文件夹中搜索需要的程序集。如果没有在这个文件夹中找到所需的程序集,那么装载失败。
Effective C# 尽可能实现短小简洁的函数
Effective C# 尽可能实现小尺寸、高内聚的程序集
Effective C# 限制类型的可见性
Effective C# 创建大粒度的Web API