Chapter 1
The CLR’s Execution Model
CLR公共运行时模型
1编译源代码为托管单元
2合并托管模块到程序集
3加载公共语言运行时CLR
4执行你的程序集代码
5本地代码生产工具:NGen.exe
6公共类型系统CTS
7公共语言规范
8与非托管代码互操作
Microsoft .NET Framework介绍了许多新的概念(concepts)、技术(technologies)和术语(terms)。在这章立我的目的是告诉你.NET Framework是怎样设计的一个大概,介绍一些framework包含的新的技术和你开始使用所将看到的许多定义的术语。我也将带你通过源代码创建自己的程序和注册组件(包含了类、结构等类型),然后解释你的程序是如何执行的。
编译源代码为托管单元
Ok,就认为你是在用.NET Framework作为你的开发环境。Great! 首先,你要明确是要创建应用程序还是组件。我们明确你已经完成了次要的东西,规范写好了,你准备开始开发了。
现在你必须决定使用那种开发语言。这个抉择通常很难,因为不同的语言提供了不同的功能。比如,通过非托管的C/C++,你能够比较底层的控制系统,可以以你所想的方式精确的管理内存,简单的创建线程等等。另一方面,VB6允许你快速的创建基于UI的应用程序,更容易操作COM对象和数据库。
公共语言运行时(CRL)正如他的名字所描述的,由不同的各种程序语言所使用的运行时。CLR的特点是对于任何所有的以CLR为目标的编程语言都有用。比如,运行时使用异常来报出错误,这样所有的以CLR为目标的语言同样可以通过异常来得到已报告的错误。另一个例子是运行时同样允许你创建线程,所以任何以CLR为目标的语言也可以创建线程。
事实上,在程序运行的时候,CLR不知道开发者使用的哪种编程语言编写源码。这意味着你可以选择能最简单的表达你的意图的那个语言。可以用任何语言编写你的代码,只要你用来编译代码的编译器是以CLR为目标的。
这样,如果我说的是真的,所使用的编程语言之间的优势是什么呢?编译器就像个语法检查器和“正确代码”分析器。他们解释你的源代码,确定whatever you've written makes some sense和描述你意图的输出代码。不同的编程语言有不同的语法。不要低估这选择的价值。对于数学的或金融应用程序,与使用Perl语法来表达同样的意图的时候相比较,使用APL语法能够解决开发时间,比如。
微软已经创建了几个以运行时为目标的语言编译器:C++/CLI,C#,VB,Jscript,J#(java语言编译器)和中间语言装配器。除了微软,其他一些公司,学校,大学也创建了以CLR为目标生产代码的编译器。我对那些编译器不甚了解:APL, Caml, COBOL, Eiffel, Forth, Fortran, Haskell, Lexico, LISP, LOGO,Lua, Mercury, ML, Mondrian, Oberon, Pascal, Perl, Php, Prolog, Python, RPG, Scheme,Smalltalk, and Tcl/Tk。
图1-1显示了编译源文件的过程。如图所示,你可以创建任何支持CLR的编程语言编写的源文件。然后使用编译器检查语法和分析代码。不管你使用哪种编译器,编译结果都是托管单元。一个托管单元是个需要CLR才能执行的标准的32位的Microsoft Windows入口可执行(PE32)文件或标准的64位入口可执行(PE32+)文件。
表1-1 托管单元的组成部分
组成部分 | 描述 |
PE32/PE32+ header | 标准的Windows PE文件头类似于公共对象文件格式头(COFF)。如果文件头使用PE32格式,这个文件就可以在32位或64位版本的Windows系统上运行。如果头文件使用PE32+格式,就要求在64位版本的Windows系统上运行。这个文件头也显示了这些类型的文件:GUI,CUI,DLL,同时包含了文件何时被创建的创的时间戳。对于仅仅包含了中间代码的托管单元,在PE32(+)文件头中,信息的大小被忽略。对于包含了本地CPU代码的托管单元,这个报头文件会包含关于本地CPU代码的信息。 |
CLR header | Contains the information (interpreted by the CLR and utilities) that makes this a managed module.头文件包含了所要求的CLR版本,一些标识,托管单元的入口函数(Main函数)的MethodDef metadata token,托管单元元素据的位置和大小,资源,强命名,一些其他少量有趣的东西。 |
Metadata | 每个托管单元都包含元素据表。有2种主要的表:描述源代码里定义的类型和成员的表和描述源代码里所引用的类型和成员的表。 |
Intermediata Language(IL) Code | 编译器编译源代码产生的代码。程序运行时,CLR编译器把中间语言代码编译为本地CPU指令集。 |
注:希望自己在提高对.net framework认识的同时提高自己的英语能力,比较过后,选了Jeffrey Richter大师的CLR Via C# 2来翻译,原因有二:
1.2006年就有了中文版,一直没有读,但却也很幸运,在翻译的同时可以有个比对,发现自己理解的错误和翻译的错误。
2.Jeffrey Richter大师解释了不会对本书做.NET3.5的更新的原因。 Jeffrey Richter's Blog