随着类的数量增加,创建二进制的组件就变得很平常了:你想分离部分功能 。所有不同的是,二进制组件可以让你独立的保存这些离散的功能。创建的组件 程序集可以方便的共享逻辑,方便交叉语言 编程,以及方便布置。
在.Net程序就是组件包,每一个程序什么样可以随时更新和发布。你应该已经知 道,基于程序集之间的应用程序是多么容易更新呀,程序集之间的偶合是多么好 呀! 最小偶合就是说更多的是减少了程序集之间复杂的依懒关系。同时也意味着 你可以简单的更新小块新 的程序集。这一章就是关于创建简单易用,容易布置 ,以及容易更新的程序集。
.Net环境中的应用程序可以由多样的二进制 组件组成。随后,你可以独立的更新这些组件,也就是可以在一个多程序集应用 程序中安装与更新一个程序集。但你必须明白一件事,那就是CLR是如何发现和 载入这些程序集的。在你创建这些二进制组件时,你也就必须创建符合这些明确 期望的组件。接下来就介绍这一概念。
CLR并不会在程序启动时加载全部 的引用程序集。更合适的作法是当运行时须要程序的成员时,加载器才解决程序 集的引用问题。这可能是调用一个方法或者访问数据,加载器先查找引用的程序 集,然后加载它,然后JIT编译须要的IL。
当CLR须要加载一个程序集时 ,先是断定那个文件要加载。程序集的元数据包含了对所有其它程序集的引用记 录,这个记录有强名称和弱名称之分。一个强名称(程序集)由四部分组成:程序 名,版本号,语言属性(译注:这里的语言范指区域性特定的信息,如关联的语 言、子语言、国家/地区、日历和区域性约定),以及公开密钥。如果程序集不是 一个强名称程序,那么就只记录了程序集名。如果你的程序是一个强名称程序集 ,那么你的程序集就不太可能被一些恶意的组件(程序集)所取代。强程序集还可 以让你用配置文件对组件的版本进行配置,是新的,还是先前的。
确定 正确的程序集以后,CLR接来就断定这个程序集是否已经在当前的应用程序中加 载。如果是,就用原来的。如果不是,CLR就继承查找程序集。如果程序是强名 称的,CLR就先在全局程序缓存(GAC)中查找,如果不在GAC中,加载器就检测代 码目录(codebase directory,译注,这里只是译为代码目录,其实并不是源代 码所在的目录)中的配置文件,如果当前代码目录存在,那就是唯一被搜索程的 目录了。如果在代码目录中没有找到所要的程序集,那么加载就失败。
如果没有直接的代码目录,加载器会搜索预先设定的目录集:
* 应用程 序目录。也就是与主应用程序集同在的位置。
* 语言目录。这是一个在 应用程序目录下的子目录,这个目录与当前语言名匹配。
* 程序集子目 录。这是一个与程序集同名的子目录,这两个可以组合成这样: [语言]/[程序 集名]
* 私有的运行目录(binPath)。这是一个在应用程序配置文件中定 义的私有目录。它同样可以和语言和程序集名组合: [bin目录]/[程序集名], 或者[bin目录]/[语言], 还可以是:[bin目录]/[语言]/[程序集名]。
从 这个讨论中你应该明白三个内容:第一,只有强名称程序集才能放到GAC中。其 次,你可以通过配置文件来修改默认的行为,从而升级程序中个别的强名称程序 集。第三,强名称程序集可以阻止对程序集的恶意篡改,从而提供更安全的应用 程序。
了解CLR是如何加载程序集的,有利于在实际操作中考虑如何创建 和更新组件。首先,你应该使用强名称程序集,把所有的元数据信息都记录下来 。当你在VS.net中创建一个项目时,你应该把assemblyInfo.cs文件中的所有属 性都填满,包括完整的版本号。这会让你在后面的升级中更简单的。VS.net在 assemblyInfo.cs中创建三个不同的部份,首先就是信息报告:
[assembly: AssemblyTitle("My Assembly")]
[assembly: AssemblyDescription
("This is the sample assembly")]
#if DEBUG
[assembly: AssemblyConfiguration ("Debug")]
#else
[assembly: AssemblyConfiguration ("Release")]
#endif
[assembly: AssemblyCompany ("My company")]
[assembly: AssemblyProduct("It is part of a product")]
[assembly: AssemblyCopyright ("Insert legal text here.")]
[assembly: AssemblyTrademark("More legal text")]
[assembly: AssemblyCulture("en-US")]
最后一条, AssemblyCulture 只针对本地化程序集。如果你的程序不包含任何的本地化资源 ,就空着。否则就应该遵从RFC1766标准填写语言描述信息。
接下来的部 份就是版本号,VS.net是这样记录的:
[assembly: AssemblyVersion("1.0.*")]