CLR执行基础
Microsoft .NET Framework 引入了许多新的概念、技术和术语。本文旨在概述.NET Framework 是如何设计的,介绍Framework包含的一些新技术,并介绍一些术语。本文为本人总结所学知识所写。
一.公共语言运行库(Common Language Runtime, CLR)这一名称准备面熟了它 的作用--------它是一个可由多种不同不同编程语言使用的运行库。CLR的特性可由面向它的所有语言使用。例如,运行库使用异常来报告错误,因此,面向运行库的任何语言都能创建线程。事实上,在运行时,CLR根本不关心开发人员用哪一种语言来写源代码。这意味着在挑选编程语言时,应该选择最容易表示自己意图的语言。可以使用任何编程语言来开发代码,只要用于编译代码的编译器面向CLR就可以了。
在这里涉及到一个托管的概念:
部分 | 说明 |
PE32或PE32+头 | 标准Windows PE 文件头,它类似于“公共对象文件格式(Common Object File Format, COFF)”头。如果这个头使用PE32格式,则文件能在Windows的32位或64位版本上运行。如果这个头使用PE32+格式,则文件只能在Windows64位版本上运行。这个头还标识了文件类型:GUI,GUI或者DLL,并包含一个时间来指出文件的生成时间。对于只包含IL代码的模块,PE32(+)头的大多信息会被忽视。对于包含本地CPU代码的模块,这个头包含了与本地CPU代码有关的信息。 |
CLR头 | 包含使这个模块成为一个托管模块的信息(由CLR和实用程序来解释)。头中包含所要求的CLR版本,一些标志,托管模块入口方法(Main方法)的MethodDef元数据标记,以及模块的元数据、资源、强名称、一些标志以及其他不太重要的数据项的位置/大小。 |
元数据 | 每个托管模块都包含元数据表。主要有俩种类型的表:一种类型的表描述源代码中定义的类型和成员,另一种类型的表描述源代码引用的类型和成员。 |
中间语言(IL) | 编译器编译源代码时生成的代码。在运行时,CLR将IL编译成本地CPU指令。 |
二. CLR实际并不和模块一起工作。相反,它是和程序集一起工作的。程序集(assembly)是一个抽象的概念,初学者往往很难把握它的精髓。首先,程序集是一个或多个模块/资源文件的逻辑性分组。其次,程序集是最小的重用、安全性以及版本控制单元。取决于编译器或工具做出的选择,既可以生成单文件程序集,也可以生成多文件程序集。在CLR的世界中,我们将程序集称为“组件(component)”。以后将会更进一步来探讨程序集。
三. 我们构建的每个程序集既可以是一个可执行应用程序,也可以是一个DLL(其中含有一系列由可执行程序使用的类型)。当然,最终由CLR来管理这些程序集中的代码的执行。这意味着必须在主机上安装好.NET Framework。Microsot创建了一个重分发包(redistribution package),可以免费把它分发给自己的客户,以便在客户机器上安装.NET Framework。一些版本的Windows在发售时已经安装好了.NET Framework。
四. 如前所述,托管程序集同时包含元数据和中间语言(IL)。IL是一种与CPU无关的机器语言,是Microsot在请教了几个外部商业和学术性语言/编译器作者之后开发出来的。IL比大多数CPU机器语言高级得多。IL能访问和操作对象类型,并提供相应的指令来创建和初始化对象,在对象上调用虚方法,并能直接操作数组元素。它甚至提供了用于抛出和扑捉异常的指令,以实现错误处理。可将IL想象成一种面向对象的机器语言。
五. 在.NET Framework 中包含Framework类库(Framework Class Libray, FCL)。FCL是一系列DLL程序集的统称,这些程序集含有千个类型定义,每个类型都揭示了一些功能。Microsoft还发布了其他许多库,比如WinFx和DirectX SDK。这些附加的库提供了更多类型,揭示了更多可用的功能。在不久的将来,Microsoft还会发布其他许多新库。开发人员可以利用这些程序集开发各式各样的应用程序。
六. CLR完全是围绕类型展开的。类型为应用程序和其他类型揭示了特定的功能。通过类型,采用一种编程语言编写的代码能够与采用另一种编程语言写的代码沟通。由于类型是CLR的根本,所以Microsoft制定了一个正式的规范,即“通用类型系统(Common Type System, CTS)”,它描述了类型的定义及其行为方式。
七. .NET Framework 具有其他开发平台无法媲美的许多优势。但是,能下定决心重新设计和重新实现其现有的全部代码的公司并不多。Microsoft 意识到了这个问题,并通过CLR来提供了一些机制,允许在应用程序中同时包含托管和非托管代码。具体地说,CLR支持三种互操作情况。
1.托管代码能调用DLL中的一个非托管函数。
2.托管代码可以使用一个现有的COM组件(server)。
3.非托管代码可以使用一个托管类型(server)。
本人还在学习中,陆续会写一些自己在学习中的心得和体会的。