第一部分 .NET体系结构

第1章 .NET体系结构

在讲C#之前,我们有必要先了解一下.NET的体系结构,因为C#虽然是一门独立的语言,但其编译、运行都要依赖于.NET或者说其基类库。因此,有必要先对.NET进行简要介绍。

提示第1章的内容是学习C#语言的基础,如果你之前没有接触过.NET,建议认真阅读;如果你已经对.NET有足够的了解,则可以略过本章,但仍然建议通读一遍,相信会有不同的收获。

.NET是微软在互联网时代的一个战略性产品,它是微软继Windows DNA之后的一个全新的、集成的、面向对象的开发平台。它以通用语言运行时(Common Language Runtime)为基础,支持多种编程语言,包括C#、F#、VB.NET、C++、Python,等等。.NET战略由微软在2000年6月22日提出,2000年发布了首个.NET版本(.NET 1.0 beta),2002年正式问世,至今近十载,其间大小更新无数,表1-1是其中的几个重要版本的更新,如下所示。

第一部分 .NET体系结构 - 图1

我们接下来看看.NET的体系结构,如图1-1所示。

第一部分 .NET体系结构 - 图2

图 1-1 .NET体系结构图

从图1-1中可以看出,.NET框架[1]是在操作系统[2]之上、应用程序之下的一个抽象层,它就像一台虚拟的电脑,负责管理运行在它之上的各种.NET应用程序的方方面面。理论上,该框架是跨平台的,基于其上的应用程序也是跨平台的。只是微软官方只提供了基于Windows平台的.NET框架实现,同时,由其他开源团体提供了基于非Widows平台的.NET框架实现,例如Mono[3]。另外,从图1-1中还可以看到,.NET框架自身的功能随着版本的升级而变得越来越丰富,.NET框架的每一次升级都会给我们带来许多惊喜,最近的4.0也不例外,提供了很多好用的新功能,具体内容会在后面的章节中一一介绍。

使用.NET可以开发各种各样的程序,从网络应用到桌面应用,再到嵌入式系统应用和手机应用,甚至是分布式的企业级应用。

下面我们将重点讨论.NET的核心——.NET框架。

1.1 .NET框架概述

从某种意义上说,.NET框架可以看作是.NET应用程序运行的虚拟机环境,它为.NET应用程序提供编译、运行、内存管理、垃圾收集、安全等服务。换句话说,.NET程序不需要与操作系统直接打交道,只需要和.NET框架打交道就可以了。从这个意义上讲,基于.NET框架开发的应用程序在理论上都是跨平台的,只需要.NET框架有相应平台的实现版本即可。这就是.NET的“平台无关性”,具体内容会在1.2节中介绍,如图1-2所示。

第一部分 .NET体系结构 - 图3

图 1-2 .NET的平台无关性

现实的情况是,截止到目前,微软官方并没有提供在非Windows操作系统平台上的.NET框架实现,但开源界有两个项目正在致力于实现这一目标,它们是:Mono[4]和Portable.NET[5]。在后面的章节中我们会了解到,其实这两者和微软提供的CLR一样都属于对CLI的实现,感兴趣的读者可以自行查阅相关资料。如果你以前是做C、C++开发的,可能习惯于为应用程序申请内存并对之进行管理和释放,现在不需要这样做了,.NET框架会自动为应用程序分配内存并负责管理和回收。当然,这种自动内存管理的特性在带来方便的同时,也会带来一定的性能损失,正所谓“鱼与熊掌不可兼得”。

.NET框架主要由两个部分组成:

❑公共语言运行时(Common Language Runtime,CLR)

❑.NET框架类库

这里还有两个很重要的概念需要大家了解:

❑托管代码

❑非托管代码

什么是托管代码呢?一般来说,仅仅使用.NET公共语言运行时提供的功能的代码叫做托管代码;反之,就是非托管代码。换句话说,在公共语言运行时控制之下运行的代码就是托管代码;反之,则是非托管代码,比如使用VisualBasic 6.0编写的代码、ActiveX控件以及Win32 API都是非托管代码。

另外,托管代码和非托管代码还可以互相调用,具体内容会在1.6节介绍,如图1-3所示。

第一部分 .NET体系结构 - 图4

图 1-3 托管代码和非托管代码之间的调用关系

注意并非.NET框架中的所有类库就都是纯粹的托管代码编写的,.NET框架中有相当数量的类是对Win32 API的封装,例如ProtectedData类[6]

[1]为了统一术语,".Net Framework"统称为“.NET框架”,全书一致。

[2]虽然.NET的主要运行平台还是Windows,但开源界已提供了Mono等可在非Windows平台上运行.NET应用的实现,目前已经可以支持大多数的.NET特性。

[3]其官方网站为:http://www.mono-project.com/Main_Page。

[4]Mono,可用性较好。

[5]Portable..NET,没有Mono成熟,项目的网址是:http://www.dotgnu.org。

[6]ProtectedData类,位于System.Security.Cryptography命名空间,提供保护数据和取消数据保护的方法,它是对DPAPI(Data Protection API,数据保护API)的封装。