公共语言运行库(CLR),也叫.NET运行库
CLR处理在.NET Framework 内部运行的
代码 (称之为托管代码),并负责管理用于执行应用程序的进程和线程。
Microsoft中间语言(MSIL)
MSIL是一个它所支持的语言的扩展集,这样保证了语言的无关性,即.NET语言不能执行MSIL不能执行的操作。
关于MSIL语言:
1.面向对象设计(OOD)
2.类的单一实现继承
3.支持接口
4.以分离方式严格处理数据类型(值类型放在堆栈上,引用类型则
存储 在堆上)
5.强类型系统(处理转换数据类型)
通用类型系统(CTS)
CTS是一个所有.NET语言都支持的数据类型的集合,确保这些语言可以相互传送数据,体现了.NET语言的互操作性。
通用类型系统定义了如何在运行库中声明、使用和管理类型,同时也是运行库支持跨语言集成的一个重要组成部分。通用类型系统执行以下功能:
1.建立一个支持跨语言集成、类型安全和
高性能 代码执行的框架。
2.提供一个支持完整实现多种编程语言的面向对象的模型。
3.定义各语言必须遵守的规则,有助于确保用不同语言编写的对象能够交互作用。
CLR内部的每一种数据都是一个对象, 象.NET Framework中的所有其他对象一样,均由System.Object派生而来。
System.Object类有四种所有类型都可以使用的方法(常被重载)。
1.Equals() 允许对象之间进行比较
2.GethashCode() 为对象返回散列代码,即对象的唯一身份
3.GetType() 成为反射
4.ToString() 返回一个类型的字符串表示法
公共语言规范(CLS)
CLS是一组定义了一种语言的边界的标准,或者说是一种语言(与CLS兼容的)必须支持或遵循的一系列语言功能,从而使得其可以与其他的.NET语言互操作。
因此只要一种语言支持CLS,那么它只能支持MSIL和CTS语言功能的一个子集。如图
语言的互操作性
上面所述,只要代码是CTS许可的,就可以与其他语言的代码交互。这意味着以下的操作都可以完成:
1.一种类型可以由使用另一种语言编写的另一种类型派生而来
2.可以将一个对象传送到一个方法,该方法属于由另一种语言编写的另一个类型
3.一旦产生一个异常,可以将这个异常在使用一种不同语言编写的代码中传递
4.一个调试器可以在代码的不同方法之间调试,并且显示源代码,即使在多种语言之间进行调试也可以的
.NET基类库(BCL)Base Class Library
BCL是一个类的集合,包含了原始数据类型并负责处理所有以前WindowsAPI包含的功能以及其他更多的功能(包括数据访问ADO.NET、文件系统访问及绘图操作等等)。基类的介绍从第七章开始。
程序集(Assembly)
程序集是已编译撑MSIL的代码的部署单位,代替了COM DLL的角色
COM将信息存储在类型库文件和注册表中,而.NET使用包含元数据的区域(清单),就可以不必在任何其他区域存储有关程序集的信息了。这在书本的第九章中有详细讲述。
分
共享程序集--.NET基类,被放在全局程序集缓存(GAC)中
私有程序集--只随应用程序的运行和安装这些组件(称之为零影响安装)
元数据(清单)包含程序集的一下信息:
1.程序集文件列表
2.引用的其他程序集
3.类型引用信息
4.版本信息
命名空间(namespace)
.NET使用namespace将类放置到逻辑组中,降低了不同的类使用同一名称而导致命名冲突的机率。
可以嵌套。
MS建议使用公司名称和项目/程序包的名称,如将Iteam类放到Company.StockSystem.Item
应用程序域
由CLR创建并实施,允许不用的应用程序毫不冲突地在同一进程中运行,并能够位需要共享数据的应用程序提供很多强大的功能。
每一个进程只能读取内存,及通过在它的40亿字节的虚拟内存中指定一个地址向内存中写入数据,而且它无权访问其他映射的实际内存
进程不能直接操作属于其他进程的内存,除非所有代码都在同一进程中运行,否则不能直接共享数据
一个进程可以含有N个应用程序域,每一个应用程序域都将拥有自己的用来执行代码的线程
如果CLR不能验证每一次访问内存的尝试,代码就不是内存类型安全的,那么它就不能与其他应用程序域共享一个进程
无用单元回收器
指.NET Framework如何管理当前正在执行的应用程序的内存。由CLR控制,并通过删除不再需要的对象(自描述类型,包括Class Types、Arrays、Delegates,接口实际上并不占用内存,指针因为使用于不安全代码中而不被回收)来清除内存。如此把在.NET Framework中运行的应用程序的内存泄漏降低到最低程度。
调用无用单元回收器十会运行对象中析构函数的代码,明智之举是不将任何运行库中关键的代码(如关闭一个文件的处理程序)放在析构函数内部。
可在代码特定点调用无用单元回收器,设计Dispose()方法的使用。这在第四章中有详细讨论。