1 命名空间
编译器接受源代码文件并生成名为 程序集 的输出文件。
在项目中,可能会使用到其他程序集的类或类型,这些程序集可能来自BCL、来自第三方供应商或是你本身创建的,而这种程序集可以称为 类库,而且它们的文件后缀通常是 .dll
而不是 .exe
。
命名空间 是共享命名空间名的一组类和类型,命名空间内的类型称为命名空间的成员。
而为了避免引用时发生同名冲突,可以定义命名空间来区分,那些命名空间名、分隔号、以及类名的完整字符串组合叫做 类的完全限定名。
一个源文件可以包含任意数目的命名空间声明,它们可以是 顺序 的也可以是 嵌套 的。然而嵌套与顺序的功能都是一样的,虽然嵌套声明命名空间位于父空间内部,但是其成员并不属于父空间,二者的命名空间都是相互独立的。
同时命名空间不是封闭的,可以在该源文件后面或另一个源文件中再次声明它,以对它增加更多的类型声明。
1.2 using
指令
完全限定名可能相当长,此时可以使用 using
命名空间指令 和 using
别名指令,它们必须放置在源文件的顶端(即任何类型声明之前),同时它们作用于当前源文件的所有命名空间。
1.2.1 using
命名空间指令
using
命名空间指令可以通知编译器你将要使用到的来自某个指定空间的类型,然后可以使用简单的类名而不必使用全路径来修饰它们。
当编译器遇到一个不在当前命名空间的名称时,它会检查在 using
命名空间指令中给出的命名空间列表,并把该未知名称添加到列表中的第一个命名空间之后
1.2.2 using
别名指令
using
别名指令允许起一个别名给 命名空间 或 命名空间内的一个类型
示例:
using Syst = System;
using SC = System.Console;
namespace MyNamespace
{
class SomeClass
{
static Main void()
{
System.Console.WriteLine("使用完全限定名");
Syst.Console.WriteLine("使用命名空间别名");
SC.Console.WriteLine("使用命名空间类别名");
}
}
}
2 程序集
程序集不包含本地机器代码,而是公共中间语言代码,它还包含实时编译器(JIT)在运行时转换CIL到本机代码所需的一切,包括对它所引用的其它程序集的引用。
程序集的文件扩展名通常为 .exe
或 .dll
,大部分程序集由一个单独文件构成,而程序集主要分为四个中重要部分:
- 清单:
- 程序集名称标识符
- 组成程序集的文件列表
- 本程序集引用的其它程序集列表
- 一个关于哪个类型被包含在哪个程序集的地图
- 类型元数据:包含该程序集中定义的所有类型的信息
- CIL:包含程序集中的所有中间代码
- 资源:可选的,可以包含图形和语言资源
程序集代码文件称为 模块。尽管大部分程序集都由当个文件组成,但也有一些事多个文件的。此时,一个文件是 主模块 ,而其他的为 次要模块。
主模块含有 程序集的的清单 和 到次要模块的引用,次要模块的文件名以扩展名 .netmodule
结尾。
2.1 程序集标识符
在.NET框架中,程序集的文件名并不像在其他操作系统和环境中那么重要,更重要的是 标识符。
程序集的标识符由四个部分组成:
- 简单名:这是不带文件扩展名的文件名,也被称为 程序集名 或 友好名称
- 版本号:有四个句点分隔的整数字符串组成,形成
MajorVersion.MinorVersion.Build.Revision
,如2.0.35.9
- 文化信息:它是一个字符串,它由 2~5个字符 组成,表示一组语言或一组语言和国家或地区
- 公匙:这个128字节的字符串应该是生产该程序集的公司唯一的
2.2 强命名程序集
强命名程序集有一个唯一的数字签名依附于它,它比没有强名称的程序集更加安全。强名称 唯一标识 了程序集,没有其他人能创建一个与之有相同名称的程序集,弱命名程序集是没有强命名的程序集。
强名称是编译器生成,它接受关于程序集的信息,并散列化这些信息用以创建一个唯一的数据签名依附到该程序集中,使用的信息如下:
- 组成程序集的字节序列
- 简单的名称
- 版本号
- 文化信息
- 公匙/私匙对
2.3 程序集的私有方式部署
如果部署应用程序好像创建一个目录并复制应用程序那样简单,应用程序不需要其他程序集,或所需的程序集都与它在同一个目录下,那么这种方法部署的程序集称为私有程序集,这种方法叫做 复制文件部署.
所以私有程序几乎可以放置在任何目录下,只要它们依赖的文件在同一个目录或子目录下就足够了。
2.4 共享程序集和GAC
有时候你会想要把一个 DLL 放在一个中心位置,这样一个单独的复制就能被系统中的其它程序集所共享。.NET 有这样的贮藏库,称为 全局程序缓存(GAC)。
只有 强命名程序集 才能被添加到 GAC 中,GAC 位于Windows系统目录的子目录中,NET4.0 之前的版本位于 \Windows\Assemly
目录中,而4.0则位于 \Windows\Microsoft.NET\assemly
中。
由于 GAC 内的全部都为 强命名程序集,所以这使得不同的引用程序能在同一时间内很容易使用不同版本的同一 DLL,这称为 并肩执行。
2.5 配置文件
配置文件由XML代码组成,并不包含C#代码。配置文件含有关于应用程序的信息,供 CLR 在运用时使用,它可以指示 CLR 使用不同版本的DLL,或搜索程序应用的DLL时在附加目录中查找。