命名空间和程序集

  1. 程序集
    • 编译器接收源代码文件并生成名称为程序集的输出文件
    • 给其他程序提供类或类型的程序集称为类库,通常以.dll结尾
    • mscorlib库
      • 程序集mscorlib.dll包含C#类型以及大部分.NET语言的基本类型的定义
      • 编译C#程序时,它必须总是被引用
    • 如果引用的多个类库中存在同名的类,在试图使用这些类时会报错,因为它不知道使用哪个版本的类,这种错误被称为命名冲突
  2. 命名空间
    • 共享命名空间名的一组类和类型
    • 在命名空间内,每个类型名必须有别于所有其他类型
    • 命名空间内的类型称为命名空间的成员
    • 一个源文件可以包含任意数目的命名空间声明,可以顺序也可以嵌套
    • 命名空间不是封闭的,可以在其他地方再次声明相同的命名空间以便对它增加更多类型声明,也可以被分成多个程序集
    • 嵌套命名空间
      • 嵌套声明的两种方式
        • 原文嵌套,直接将命名空间放在一个封闭的命名空间内部
        • 分离的声明,如namespace A.B { ... },其中A是一个声明在其他位置的命名空间,B是嵌套在A内部的命名空间
      • 当生成单个程序集时,两种形式的嵌套命名空间生成相同的程序集
      • 内部命名空间内的成员不属于父命名空间,也就是说父命名空间和内部命名空间直接是相互独立的
  3. using指令
    • using命名空间指令
      • 使用命名空间,可以在使用类时省略命名空间名
    • using别名指令
      • 可以给命名空间或命名空间内的一个类型取别名
      • using Syst = Syestm; using SC = System.Console;
  4. 程序集的结构
    • 程序集不包含本地机器代码,而是公共中间语言代码。它还包含实施编译器JIT,在运行时转换CIL到本机代码所需的一切,包括对它所引用的其他程序集的引用。程序集的文件扩展名通常为.exe和.dll
    • 4个主要部分
      • 清单
        • 程序集名称标识符
        • 组成程序集的文件列表
        • 一个指示程序集中内容在哪里的地图
        • 关于引用的其他程序集的信息
      • 类型元数据
        • 包含该程序集中定义的所有类型的信息。这些信息包含关于每个类型要知道的所有事情
      • CIL代码
        • 包含程序集所有的中间代码
      • 资源部分
        • 可选,但可以包含图形或语言资源
    • 程序集代码文件称为模块,尽管大部分程序集由单文件组成,但有些也有多个文件。对于有多个模块的程序集,一个文件是主模块,而其他的是次要模块
      • 主模块含有程序集的清单和到次要模块的引用
      • 次要模块的文件名以扩展名.netmodule结尾
      • 多文件程序集被视为一个单一单元,它们一起部署一起定版
  5. 程序集标识符
    • 在.NET模块中,程序集的文件名不像在其他操作系统和环境中那么重要,更重要的是程序集的标识符
    • 标识符的组成
      • 简单名:不带扩展名的文件名,也被称为程序集名或友好名称
      • 版本号:由4个句点分开的整数字符串组成
      • 文化信息:由2-5个字符组成,代表一种语言或一种语言和一个国家或地区
      • 公钥:128字节字符串,是该程序集公司唯一的
        • 公钥是公钥/私钥对的一部分,它们是可以用于创建安全的数字签名
    • 标识符被包含在程序集清单中