1.4 .NET Framework的体系结构
C#程序在.NET Framework上运行,它是Windows的一个必要组件,如图1-1所示为.NET Framework的体系结构。.NET Framework包括两大组件:公共语言运行库(Common Language Runtime,CLR)和.NET Framework类库(Framework Class Library,FCL)。
图1-1 .NET Framework的体系结构
1.4.1 公共语言运行库
公共语言运行库提供了异常处理、安全、调试以及任何语言的版本支持等功能。它可以使用各种程序设计语言,并提供跨语言的公共工具集,从而确保了代码之间的互用性。如图1-2所示为.NET框架的组件。
图1-2 .NET框架组件
CTS(Common Type System,通用类型系统)和CLS(Common Language Specification,公共语言规范)是CLR的子集。
CTS定义了在IL中的数据类型,如C#中的int类型和VB.NET中的Integer类型都被编译成Int32。
CLS是CLR支持的语言功能的子集,它包括几种面向对象的编程语言的通用功能。
公共语言运行库是Microsoft的公共语言基础结构(Common Language Infrastructure,CLI)的一个商业实现。CLI是一种国际标准,是用于创建语言和库在其中无缝协同工作的执行和开发环境的基础。可以将运行时看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行时的基本原则。以运行时为目标的代码称为托管代码,而不以运行时为目标的代码称为非托管代码。类库是一个综合性的面向对象的可重用类型集合,可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面(Graphical User Interface,GUI)应用程序,也包括基于ASP.NET所提供的最新创新的应用程序。
.NET Framework可由非托管组件承载,这些组件将公共语言运行库加载到它们的进程中并启动托管代码的执行,从而创建一个可以同时利用托管和非托管功能的软件环境。.NET Framework不但提供若干个运行时宿主,而且还支持第三方运行时宿主的开发。
用C#编写的源代码被编译为一种符合CLI规范的中间语言(Intermediate Language,IL)。IL代码与资源(如位图和字符串)一起作为一种称为程序集的可执行文件存储在磁盘上,通常具有的扩展名为.exe或.dll。程序集包含清单,它提供关于程序集的类型、版本、区域性和安全要求等信息。
执行C#程序时,程序集将加载到CLR中,这可能会根据清单中的信息执行不同的操作。然后,如果符合安全要求,CLR执行实时(Just In Time,JIT)编译以将IL代码转换为本机机器指令。CLR还提供与自动垃圾回收、异常处理和资源管理有关的其他服务。由CLR执行的代码有时称为“托管代码”,它与编译为面向特定系统的本机机器语言的“非托管代码”相对应。
语言互操作性是.NET Framework的一个关键功能。因为由C#编译器生成的IL代码符合CTS的规范,因此从C#生成的IL代码可以与从Visual Basic、Visual C++、Visual J#的.NET版本或者其他二十多种符合CTS的语言中的任何一种生成的代码进行交互。单一程序集可能包含用不同.NET语言编写的多个模块,并且类型可以相互引用,就像它们是用同一种语言编写的。
1.4.2 .NET Framework类库
除了运行时服务外,.NET Framework还包含一个由四千多个类组成的和任何.NET语言协同工作的内容详尽的库——.NET Framework类库,这些类被组织为命名空间,为从文件输入和输出到字符串操作、到XML解析、到Windows窗体控件的所有内容提供多种有用的功能。比如对数据库支持的类库以及线程的类库等。典型的C#应用程序使用.NET Framework类库广泛地处理常见的“日常”任务。