CLR的执行模型(C#)html
流程:编程
1.将源代码编译成委托代码——>2.将委托代码合并成程序集——>3.执行程序集代码——>4.加载公共语言进行时安全
注:CLR(Common Language公共语言)CLR是一个可由多种编程语言使用的“运行时”。CLR的核心功能(e.g.内存管理、程序集加载、安全性、异常处理、线程同步等),可由面向CLR的全部语言使用。编程语言
一、将源代码编译成委托模块:工具
CLR根本不关心开发人员用那一种语言来写源代码,说明我咱们写C#代码的时候确定还通过必定的步骤才能跟CLR,因而就须要相应的面向CLR的、能够编译C#代码的编译器,以便CLR能够识别你写的东西。这个编译器会检查语法和分析源代码,产生的是一个托管模块线程
注:htm
托管模块是一个能够在CLR中执行的PE(Portal Executable)文件。内存
书中介绍托管模块由PE32或PE32+头、CLR头、元数据、IL(中间语言)代码。看的时候我的以为理解元数据和IL比较重要。资源
元数据:包含两种类型的元数据表:一个表描述源代码中定义的类型和成员;另外一个表描述源代码引用的类型和成员 。开发
IL(中间语言)代码:编译器编译源代码时生成的代码。在运行时,CLR将IL编译成本地CPU指令。(IL代码有时称为托管代码,由于CLR要管理它的执行)
二、将托管代码合并成程序集:
(CLR实际不和模块一块儿工做。相反,他是和程序集一块儿工做的)
前面说到CLR不会识别你的具体语言,须要相应编译器生成相应的托管模块。这会又说实际不和模块一块儿工做,引入了程序集的概念。文中说程序集是一个抽象的概念。
托管模块(IL和元数据)、资源文件(.jepg,.gif,.html等)——>将多个托管模块和资源文件合并成程序集的工具(C#编译器 CSC.exe)——>程序集(清单:描述程序集中的文件集)
三、加载公共语言运行时:
你生成的程序集既能够是一个可执行的应用程序,也能够是一个DLL(其中含有一组可执行程序使用的类型)。最终由CLR管理这些程序集中的代码的执行。
加载公共语言进行时时window的事,咱们能够考虑在window的一系列以后会初始化CLR,而后加载exe程序集,而后调用其入口方法Main()。随即,托管的应用程序将启动并运行。
四、执行程序集代码:
在第一步,即源代码编译成托管模块的时候提到:元数据老是和包含IL代码的文件关联,因为编译器同时生成元数据和代码,把他们绑定一块儿,并嵌入最终生成的托管模块,因此元数据和他描述的IL代码用惯不会失去同步
可想而知,当你调用入口方法(Main)的时候,元数据也跟着进来了,他们是一对好基友