Part I CLR Basics
1 The CLR’s Execution Model
微软.NET框架引入了很多新的概念,技术和术语(terms)。本章中我的目的是给你一个梗概,比如.NET框架是如何设计的,像你介绍了该框架包含的一些新技术,以及在你开始使用一些术语前做定义。我还将通过创建一个包含类型(类,结构等等)的应用程序或者可发布的组件集(文件)来想你解释你的应用程序是如何执行的。
1.1Compiling Source Code into Managed Modules 将源文件编译为托管模块
太好了!,既然你已经决定使用.NET作为你的开发平台。您的第一个步骤是确定你打算建立哪种类型的应用程序或组件。让我们姑且认为你已经完成了这个小细节,平台的一切是设计好的,规格是写好的,你就可以准备开发了。
现在你必须决定哪些编程语言的使用。这一任务通常是困难的,因为不同的语言提供不同的功能。例如,在非托管的C / C + +中,你可以对底层进行更好的控制。您可以以你希望的方式管理内存,创建线程,等等。微软的Visual Basic 6,允许您非常迅速的构建用户界面的应用程序,使您更容易控制COM对象和数据库。
公共语言运行库(CLR)的正如它的名字说的那样:它是一个可以被不同的编程语言使用的运行时。CLR的核心功能(如内存管理[memory management],集加载[assembly loading],安全[security],异常处理[exception handling]和线程同步[thread synchronization])可向最终编译被CLR的各种不同的编程语言使用。例如,在运行时使用异常来报告错误,因此所有使用运行时的语言也是通过异常来报告错误。另一个例子是,运行时也可以创建一个线程,因此任何使用运行时的语言可以创建一个线程。
实际上,CLR在运行时对开发人员使用哪种编程语言来完成源代码一无所知。这意味着我们应该选择更容易实现我们目的的编程语言。我们可以用任何编程语言来编写你的代码,前提是我们使用的编译器能够编译面向CLR的代码。
如果我说的是正确的,那么我们选择这样那样的编程语言是为了什么呢?嗯,我觉得我们可以将编译器理解为语法检查器和“正确代码”分析器。他们检查你的源代码,确保我们写的代码有意义,然后输出代码,描述你的意图。不同的编程语言允许你开发使用不同的语法。不要低估了这一选择的价值。对于数学或金融应用,使用APL比使用Perl来达到相同的目的,可以节省更多的开发时间。
微软已经创建了几个语言编译器的目标运行中:C ++ / CLI中,C#时,Visual Basic,F#,Iron Python, Iron Ruby, a以及一个中间语言 (IL) 汇编器。除此之外,其他一些公司、学校也在创建面向CLR的编译器。 就我知道的有 Ada, APL, Caml, COBOL, Eiffel, Forth, Fortran, Haskell, Lexico, LISP, LOGO, Lua, Mercury, ML, Mondrian, Oberon, Pascal, Perl, Php, Prolog, RPG, Scheme, Smalltalk, 以及Tcl/Tk.
图1-1显示了源代码文件的编译过程。如图所示,您可以使用任何支持CLR的编程语言创建源代码文件。然后使用相应的编译器检查语法和分析的源代码。不管你使用哪个编译器,结果是都是一个托管模块(managed module)。托管模块是一个标准的32位Microsoft Windows可移植可执行(PE32)文件或一个标准的64位Windows移植可执行(PE32 +)文件,要求CLR执行。顺便说一下,托管集经常会利用数据执行保护(DEP)和地址空间布局随机化(ASLR)在Windows的优势,这两项功能提高您的整个系统的安全。
本机代码编译器产生指向一个特定的CPU架构,例如x86,x64或Ia64文件,代码。所有的CLR兼容的编译器生成的IL代码代替。(我将会在后面的章节对有关IL代码做更详细的讲解。)IL代码有时称为托管代码,因为通过CLR管理来执行。
除了产生IL,每个面向CLR的编译器必须将完整的元数据释放到每一个托管模块。总之,元数据就是那些有关模块定义(如类型及其成员)的数据表的集合。此外,元数据还有托管模块使用的引用的表,如导入的引用类型及其成员。元数据是一个比较老的技术,如COM的类型库和接口定义语言(IDL)文件的超集。但要注意的是,CLR的元数据更为完整。而且,不同于类库和IDL,元数据是始终与包含IL代码的文件关联。事实上,元数据总是像代码一样嵌入在相同的EXE / DLL中,使得它们两个无法分开。因为编译器在同时产生的元数据和代码,并绑定到生成的管理模块,元数据和IL代码它描述他们从来不同步与另一个。
Metadata有许多用途。下面是其中一些:
●元数据在编译时删除了对原生的C / C + +头文件和库文件需求,因为所有有关引用类型/成员的信息都已经包含在通过IL来实现类型/成员的文件里。编译器可以直接读取元数据托管模块。
●Microsoft Visual Studio使用元数据来帮助你写代码。它的智能感知功能解析元数据来告诉你提供的方法,属性,事件和字段类型,以及在一个方法,该方法需要什么参数的情况。
●CLR的代码验证机制使用元数据,来确保您的代码执行是“类型安全”的。 (稍后我将简短进行讨论验证。)
●Metadata允许一个对象的字段被序列化到内存块,发送到另一台机器,然后反序列化,在远程计算机上重建对象的状态。
●Metadata允许垃圾收集器跟踪对象的生存期。对于任何对象,垃圾收集器可以判断对象的类型,并从元数据,知道哪些领域是指在该对象的其他对象。
在第2章Building, Packaging, Deploying, and Administering Applications and Types “创建,包装,部署和管理应用程序和类型,”我会更详细地描述元数据。
微软的C#,Visual Basic,F#中,以及IL汇编程序总会产生包含托管代码(IL)和托管数据(GC数据类型)的模块。最终用户必须在他们的计算机上安装CLR(现为.NET框架的一部分),以执行任何包含托管代码和/或托管数据,当然,他们还必须有Microsoft基础类(MFC)库或已经安装Visual Basic的DLL或Visual Basic 6应用程序。
默认情况下,微软的C + +编译器在运行时生成的EXE / DLL模块中包含非托管 (本机)代码和操作(本机内存)非托管数据,这些模块不需要在CLR执行。但是,也可以通过指定/ CLR的命令行开关,在C + +编译器生成包含托管代码的模块,当然,这样必须安装CLR来执行此代码。微软提到的所有编译器,C + +是独特的,它是允许开发人员编写托管和非托管代码,并成为一个单一模块发布的唯一的编译器。这也是唯一的Microsoft编译器,允许开发人员定义托管和非托管源代码中的数据类型。微软的C + +编译器提供的灵活性是其他的编译器无法比拟的,因为它允许开发人员从托管代码使用他们现有的本地C / C + +代码,来整合他们觉得合适的托管类型。
作者:石世特
出处:http://www.cnblogs.com/TivonStone/
希望本文对你有所帮助,想转随便转,心情好的话给我的文章留个链接.o(. .)o