知识在与温故、总结-再读CLR

CLR,通用语言运行时,每个.Net 程序猿,都会第一时间接触到。记得2008年,第一次学习Jeffrey Richter的CLR Via C#,读的懵懵懂懂,大抵因为编码太少,理解的只是概念和皮毛。10年之后,再次找出Jeffrey Richter的CLR Via C#这本书,重读CLR。归纳总结,同时加深自我的底层技术理解和深度。分享给大家自己的总结笔记:

讲在前面的话

合抱之木,生于毫末;九层之台,起于垒土!

整个.Net 大厦建筑的底层基础技术就是CLR,通用语言运行时。CLR给我们带来JIT、垃圾回收、MSIL、Meta Data、Application Domain等一系列概念,它们共同协作,合力打造了一个与非托管代码完全不同的一个新的开发环境。每个组件如何和谐地与其他组件协作,平稳地运行.Net 应用,只有深入了解CLR,才能“拨开云雾见天日,守得云开见月明”!

总结Part1:CLR是什么? 我们的源码如何被编译成托管模块的?

  CLR:公共语言运行时(Common Language Runtime,CLR),一个可以由多种不同编程语言使用的运行时。

  Mircosoft面向CLR提供了几种编程语言编译器,包括:C#、VB、J#、C++、Jscript以及一个中间语言(Intermediate Language,IL)等编译器。因此,我们可以使用支持CLR的任何编程语言来创建源代码文件,实现实际的业务逻辑。

  创建源代码文件之后,要使用一个相对应的编译器来检查语法和分析源码,最后编译成一个“托管模块”。

  托管模块是一个标准的32位Microsoft Windows可移植执行体(PE32)文件,后者是一个标准的64位Microsoft Windows可移植执行体(PE32+)文件,这些文件需要CLR才可以执行。

  将源代码编译为托管模块:

  

知识在与温故、总结-再读CLR

  所有CLR支持的编译器通过编译生成的都是“中间语言(Intermediate Language,IL)代码”,IL代码有时也称为托管代码,因为CLR会管理它的执行。除了生成IL,编译器还会在每个托管模块中生成完整的元数据,元数据Meta Data是一系列特殊的数据表,描述了模块中定义的内容,比如类型及成员。同时元数据表还记录了当前托管模块引用的内容,比如引用的类型及成员。

  托管模块由哪几个部分组成呢?

  

知识在与温故、总结-再读CLR

总结Part2:将托管代码编译为程序集

   将源代码编译为托管模块之后,CLR实际上并不和托管模块一起工作,相反,CLR与程序集一起工作。

   程序集(assembly)是一个抽象的概念,是一个或者多个模块/资源文件的逻辑性分组。同时,程序集是一个最小的重用、安全性以及版本控制单元。

   默认情况下,将托管模块和源文件转换成一个程序集的工作由编译器完成。

   

知识在与温故、总结-再读CLR

总结Part3:加载CLR

   我们编译的每个程序集既可以是一个可执行的应用程序,也可以是一个DLL(动态链接库,其中含有一系列有可执行程序使用的类型)。最终由CLR来管理这些程序集中的代码的执行。这就要求主机上必须安装.Net Framework.

   在了解CLR具体如何加载之前,我们先了解下程序集的32位和64位版本问题,及支持X86和X64 Windows平台。在Visual Studio的Project属性Build选项中,可以选择Target Platform,如果选择X86,C#编译器生成的程序集包含一个PE32头,如果选择X64,将包含PE32+头。运行一个可执行文件时,Windows会检查这个EXE文件的头,判断应用程序需要的是32位地址空间,还是64位地址空间,具有PE32头的文件可以在32位和64位地址空间中运行,具有PE32+头的文件则要求一个64位地址空间。

   以下总结了C#编译器指定不同的Platform选项,会得到什么托管模块,以及运行的Windows平台:

   

知识在与温故、总结-再读CLR

    Windows会检查EXE文件头,判断是32位进程,还是64位进程,或者Wow64进程之后,Windows在进程的地址空间中加载MSCoreEE.dll的X86、X64或者IA64版本,进程的主线程会调用MSCoreEE.dll内部定义的一个方法,这个方法会初始化CLR,加载EXE程序集,然后调用其入口方法(Main)方法。随即,被托管的应用程序将启动并运行。

    如果一个非托管应用程序通过LoadLibrary来加载一个托管的程序集,Windows会加载并初始化CLR来处理包含在程序集中的代码。

总结Part4:代码执行

   前面我们介绍了,托管程序集同时包含元数据和中间语言(IL),IL是一种与CPU无关的机器语言

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywfgw.html