【CLR】程序集和命名空间
将模块合并成程序集
控制台应用Program并非只是含有元数据的PE文件,他还是程序集(assembly)。程序集是一个或多个类型定义文件及资源文件的集合。在程序及的所有文件中,有一个文件容纳了清单(manifest)。清单也是一个元数据表集合,表中主要包含作为程序集组成部分的那些文件的名称。此外,还描述了程序集的版本、语言文化、发布者、公共导出的类型以及构成程序集的所有文件。
CLR操作的是程序集。换而言之,CLR总是首先加载包含清单元数据表的文件,再根据清单来获取程序集中的其他文件的名称。下面列出了程序集的重要特点。
1 程序集定义了可重用的类型
2 程序集用一个版本号标记
3 程序集可以管理安全信息
除了包含清单元数据表的文件,程序集其他单独的文件并不具备上述特点。
类型为了顺利地进行打包、版本控制、安全保护以及使用,必须放在座位程序集一部分的模块中。程序集大多数时候只有一个文件,就像前面的Program.exe那样。然后,程序集还可以由多个文件构成:一些事含有元数据的pe文件,另一些是.gif或.jpg这样的资源文件。为便于理解,可将程序集视为一个逻辑EXE或DLL。
Microsoft为什么引入程序集的概念?这是因为使用程序集,可重用类型的逻辑表示与物理表示就可以分开。例如,程序集可能包含多个类型。可以将常用类型放到一个文件中,不常用类型放到另一个文件中。如果程序集要从internet下载并部署,那么对于含有不常用类型的文件,加入客户端不使用那些类型,该文件就永远不会下载到客户端。
使用多文件程序集的额外三个理由
1 不同的类型用不同的文件,使文件能以“增量”方式下载(就像前面在internet下载的例子描述的那样)。另外,将类型划分到不同的文件中,可以对购买和安装的应用程序进行部分或分批打包/部署。
2 可在程序集中添加资源或数据文件。例如,假定一个类型的作用是计算保险信息,需要访问精算表才能完成计算。在这种情况下,不必在自己的源代码中签入精算表。相反,可以使用有一个工具,使数据文件称为程序集的一部分。数据文件可为任意格式——只要应用程序知道如何解析。
3 程序集包含的各个类型可以用不同的编码程序语言来实现。然后 可以用工具将所有模块合并成单个程序集。
总之,程序集是进行重用、版本控制和应用安全性设置的基本单元。它允许将类型和资源文件划分到单独的文件中。这样一来,无论你自己还是用户,都可以决定打包和部署那些文件,一旦CLR加载还有清单的文件,就可确定在程序集的其他文件中。
命名空间和程序集
命名空间对相关的类型进行逻辑分组,开发人员可通过命名空间方便地定位类型。例如,system.test命名空间定义了执行字符串处理的类型,而System.io命名空间定义了执行i/o操作的类型。
对于编译器,命名空间的作用就是为类型名称附加以句点分隔的符号,使名称变得更长,更可能具有唯一性。
命名空间更多的是对编译器和我们这些写代码的人而言的概念,方便我们的编写和编译。clr对“命名空间”一无所知。访问类型时,clr需要知道类型的完整名称(可能是相当长的、包含句点符号的名称)以及该类型的定义具体在哪个程序集中,这样“运行时”才能加载正确程序集,找到目标类型,并对其进行操作。
using指令简化了类型名称,编译器会对当前代码中未识别的类型自动去匹配using 中引用的命名空间,直到找到对应类型。当然也会有潜在问题:可能两个或更多类型在不同命名空间中同名。为了消除歧义,必须显式告诉编译器需要需要生死用哪个类型。
c# using指令的另一种形式允许为类型或命名空间创建别名。如果只想使用命名空间中的少量代码,不想它的所有类型都跑出来“污染”全局命名空间,别名就显得十分方便。
using a=wwwwww.asdasd;
注意:命名空间和程序集不一定相关。特别是,同一个命名空间中的类型可能在不同程序集中实现。同一个程序集也可能包含不同命名空间中的类型,例如system.int32和system.text.StringBuilder类型都在MSCorLib.dll程序集中。