第一章 .NET之道
一、.NET框架的一些核心功能
1、对已有具有完全的互操作性
已有的COM二进制组件可以和更新的.NET二进制组件共存,反之亦然。利用平台调用(PInvoke)服务可以在.NET的代码里调用基于C的库。
2、完全的语言集成
支持跨语言继承、跨语言异常处理和跨语言的调试。
3、所有支持.NET的语言共用公共运行库引擎
这个引擎具有一组明确定义的类型,而每一种支持.NET的语言都能明白这些类型。
4、基类库
这个库隐藏了原始API调用的复杂性,还提供了被所有支持.NET的语言所使用的一致的对象模型。
5、不关注COM底层操作
IDL代码和VARIANT数据类型不会出现在本机.NET二进制代码中。
6、真正简化的部署模型
不需要将二进制单元注册到系统注册表。允许*.dll的不同版本存在于同一台机器上。
二、.NET平台各模块
2.1、公共类型系统CTS
类型:指的是集合{类,结构,接口,枚举,委托}中的任意成员。
类型成员:集合{构造函数,终结器,静态构造函数,嵌套类型,运算符,方法,属性,索引器,字段,只读字段,常量,事件}中的元素之一。类型成员可有各种修饰语。CTS规范完整的描述了运行库所支持的所有可能的数据类型和编程结构,指定了这些实体间如何交互,也规定了它们在.NET元数据格式中的表示。它规定了类型必须如何定义才能被CLR承载。
一般来说,只有那些创建针对.NET平台的工具或编译器的人才对CTS的内部工作非常关心。
上述五种类型在下文详述。
2.2、公共语言规范(CLS)
定义了一个让所有的.NET语言都支持的公共类型和编程结构的子集。它清晰的描述了支持.NET的编译器必须支持的最小的和完全的特征集,以生成可有CLR承载的代码,同时可以被基于.NET平台的其他语言用统一的方式进行访问。它可以看成由CTS定义的完整功能的一个子集。
最重要的规则:CLS规则仅适用于类型中向定义它的程序集以外公开的部分。
只有工具/编译器的开发人员才会对CTS和CLS规则的具体细节感兴趣。
确保遵循CLS:[assembly: System.CLSCompliant (true)]。
2.3、公共语言运行库CLR
微软实现的满足CLS规范的软件层。主要作用是为我们定位、加载和管理.NET类型,同时也负责大量底层细节的工作,如内存管理、安全检查等。
可以理解为执行给定编译代码单元所需的外部服务的集合。
CLR中最重要的部分是名为mscoree.dll的库,称为“公共对象运行库执行引擎”。当用户程序引用一个程序集,要使用它时,mscoree.dll将首先自动加载,然后由它负责将需要的程序集导入内存。运行库引擎首要的任务就是负责解析程序集的位置,并通过读取其中包含的元数据,在二进制文件中发现所请求的类型。接着,CLR在内存中为类型布局,将关联的CIL编译成特定平台的指令,执行所有需要的安全检查,然后运行当前的代码。
三、其他重要概念
3.1、基类库(BCL)
.NET平台提供的一个适用于全部.NET程序语言,封装了各种基本的类型。
最重要的是mscorlib.dll。
3.2、程序集
表现形式就是.exe或.dll,但是和传统意义上的不同。
包含:IL代码和类型元数据。CIL代码类似Java的字节码,只在绝对必需的时候才被编译成特定平台的指令。元数据详尽描述了二进制文件中每个“类型”的特征。
清单:程序集本身也使用元数据来进行描述,称之为“清单”。
一般是单文件程序集,多文件程序集中的每一个二进制文件称为一个“模块”,其中一个为主模块,除了包含自身CIL指令和各种类型元数据,还包含程序集清单,其他模块包含一个模块级的程序集清单、CIL和类型元数据。
多文件程序集的优点:为了部署的灵活性。
3.3、公共中间语言(CIL)
即时(JIT)编译器负责将CIL代码编译成机器代码,第一次使用时编译好后放在内存中,以后就不需要再次编译。
3.4、元数据
类型元数据用来描述每一个二进制文件中定义的类型(类、结构、枚举等),以及每个类型的成员(属性、方法、事件等)。3.5、程序集/命名空间、类型的区别
命名空间就是一个程序集内相关类型的一个分组。一个程序集可以包含任意个命名空间,每个命名空间又可以包含多种类型。