c#和.NET框架



.NET框架的组成

  .NET由三部分组成,如图所示:

执行环境被称为CLR(Common Language Runtime,公共语言运行时)。CLR在运行期管理程序的执行,包括以下的内容:   ■ 内存管理   ■ 代码安全验证   ■ 代码执行   ■ 垃圾收集   编程工具涵盖了编码和调试需要的一切,包括:   ■ Visual Studio集成开发环境   ■ .NET兼容的编译器(例如:c#、VB、JScript和托管的C++)   ■ 调试器   ■ 服务器端改进,比如ASP.NET   BLC(Base Class Library,基类库)是.NET框架使用的一个大的类库,而且也可以在你的程序中使用。

.NET的特点

  1、面向对象的开发环境   CLR、BCL和c#被设计的完全面向对象,并形成良好的集成环境。   系统为本地程序和分布式系统都提供了一致的、面向对象的编程模型。它还为桌面应用程序、移动应用程序和web开发提供了软件开发接口,设计的对象范围很广,从计算机服务器到手机。      2、自动垃圾回收   CLR有一项服务称为GC(Garbage Collector,垃圾收集),它能为你自动管理内存。   ■ GC自动从内存中删除程序不再访问的对象。   ■ GC使程序员不再操心许多以前必须执行的任务,比如释放内存和检查内存泄漏。这可不是个小特性,因为检查内存泄漏可能非常困难而且耗时。

  3、互操作性   .NET框架的设计专门考虑了不同的.NET语言、操作系统或win32DLL和COM之间的互操作性。   ■ .NET语言的的互操作性允许在不同的.NET语言编写的软件模块间无缝的交互。     □ 一种.NET语言写的程序可以使用甚至继承另一种.NET语言写的类,只需要遵循一定的规则即可。     □ 正因为它能够很容易的继承不同编程语言生成的模块,.NET平台有时被称为*语言无关的平台*。   ■ .NET提供了一种称为平台调用(Plarform invoke,P/Invoke)的特性,允许.NET的代码调用并使用非.NET的、但通过标准win32DLL导出的纯C函数的代码,比如windows API。   ■ .NET框架还允许与COM的互操作性。.NET软件组建能调用COM组件,而且COM也能调用.NET组件,就像它们是COM组件一样。

  4、不需要COM   .NET框架使程序员摆脱了COM的束缚,作为一个c#程序员,不需要使用COM。也就是不需要下面这些内容了:   ■ IUnknown接口:在COM中,所有对象必须实现*IUnknown*接口。相反,所有的.NET对象都继承一个名为*object*的类。接口编程仍是.NET中的一个重要部分,但不再是中心主题了。   ■ 类型库:在COM中,类型信息保存在类型库中当作.tlb文件,它和可执行代码是分开的。在.NET中,程序的类型信息和代码一起被保存在程序文件中。   ■ 引用计数:在COM中,程序员必须记录一个对象的引用数目已确保它不会再错误的时间被删除。在.NET中,GC记录引用情况并只在合适的时候删除对象。   ■ HRESULT:COM使用HRESULT数据类型返回运行时错误代码。.NET不使用HRESULT。相反,所有意外的运行时错误都产生异常。   ■ 注册表:COM应用必须在系统注册表中注册。注册表保存了与操作系统的配置和应用程序有关的信息。.NET应用不使用注册表,这简化了程序的安装和卸载。

  5、简化的部署   部署为.NET框架编写的程序比以前容易很多,这是由于一下一点原因:   ■ .NET程序不需要使用注册表注册,这意味着在最简单的情形下,一个程序只需要被复制到目标机器上便可运行。   ■ .NET提供一种成为并行执行的特性,允许一个DLL的不同版本在同一台机器上存在。这意味着每个可执行程序都可以访问程序生成时使用的那个版本的DLL。

  6、类型安全性   CLR检查并确保参数及其他数据对象的类型安全,即使在不同的编程语言编写的组件之间。

  7、基类库   .NET框架提供了一个广泛的基础类库,很自然地,它被称为基类库(Base Class Library,BCL;有时候称为框架类库——Framework Class Library,FCL)。在自己写的程序时,可以使用这些丰富的代码,包括以下一些类:   ■ 通用基础类:这些类提供了一组极为强大的工具,可以应用到广发的编程任务重,比如字符串操作、安全和加密。   ■ 集合类:这些类实现了列表、字典、散列表以及位数组。   ■ 线程和同步类:这些类用于创建多线程程序。   ■ XML类:这些类用于创建、读取以及操作XML文档。

编译成CIL

  .NET语言的编译器接受源代码文件,并生成名为*程序集*的输出文件。程序集可以是可执行文件或者DLL。编译过程如下图:   ■ 程序集里的代码并不是本机代码,而是一种名称为CIL(Common Intermediate Language,公共中间语言)的中间语言。   ■ 程序集包含的信息中,包括了以下项目:     □ 程序的CIL     □ 程序中使用的类型的元数据     □ 对其他程序集引用的元数据      不同的参考书或者博客中可能会使用不同的术语,可能会遇到其他的两个CIL的术语:IL(Intermediate Language)和MSIL(Microsoft Intermediate Language)。

编译成本机代码并执行

  程序的CIL直到它被调用运行时才会被编译成本机代码。在运行时,CLR执行下面的步骤:   ⒈检查程序集的安全特性;   ⒉在内存中分配空间;   ⒊把程序集中的可执行代码发送给*实时(Just-in-Time,JIT)编译器*,把其中的一部分编译成本机代码。

  程序集中的可执行代码在需要的时候由JIT编译器编译,然后它就被缓存以备在后来程序中执行。使用这个方法意味着不被调用的代码不会被编译成本机代码,而且被调用的代码只被编译一次。   一旦CIL被编译成本机代码,CLR就在它运行时管理它,执行像释放无用内存、检查数组边界、检查参数类型和管理异常之类的任务。在这这个过程中有两个重要的术语:托管代码和非托管代码。   ■ 托管代码:为.NET框架编写的代码称为托管代码(managed code),需要CLR。   ■ 非托管代码:不在CLR的控制下运行的代码,比如win32 C/C++ DLL,称为非托管代码。

  编译和执行综述:   无论原始文件的语言是什么,都遵循同样的编译和执行过程。

CLR

  .NET框架的核心组件时CLR,它在操作系统的顶层丙管理程序的执行,如下图所示:   CLR还提供下列服务:   ■ 自动垃圾回收   ■ 安全和认证   ■ 通过访问BCL得到广泛的编程功能,包括如Web服务和数据服务之类的功能

CLI

  每种编程语言都有一组内置的类型,用来表示整数、浮点数和字符等之类的对象。在历史上,这些类型的特征在编程语言之间和平台之间都不同。例如组成整数的位数在不同的语言和平台之间就有很大的差别。   这种缺乏统一性让我们难以使用其他编程语言编写的库和程序,为了有序和协作,必须有一组标准。   CLI(Common Language Infrastructure,公共语言基础结构)就是这样一组标准,它把所有.NET框架的组件连结成一个内聚的、一致的系统。它展示了系统的概念和架构,并详细说明了所有软件都必须坚持的规则和约定。    CLI的重要组成部分   ⒈公共类型系统   CTS(Common Type System,公共类型系统)定义了那些在托管代码中一定会使用的类型的特征。CTS的一些重要方面如下:     ■ CTS定义了一组丰富的内置类型,以及每种类型确定的、详细的特性。     ■ .NET兼容编程语言提供的类型通常映射到CTS中已经定义的内置类型集的某一个特殊子集。     ■ CTS最重要的特征之一是*所有的类型都继承自公共的基类————object*。   ⒉公共语言规范   CLS(Common Language Specification,公共语言规范)详细说明了一个.NET兼容编程语言的规则、属性和行为。

术语缩写回顾