在这篇文章中,我给大家详细介绍了c#源代码的实现过程,有需要的朋友可以借鉴一下。
说到C#源代码的执行过程,首先要提到汇编,因为Clr处理的不是托管块,而是汇编(dll,exe)。
1、从哪里来
程序集由一个或多个托管模块和资源文件组成。当C#编译器(csc.exe)将源代码编程为IL代码和元数据时,它将进一步与资源文件组合成一个程序集。
其实就是一个PE32文件,里面包含了一个manifest文件,几个托管的模块和资源(如图),以及程序集中的一些自描述信息。
2、执行过程
编译器生成汇编后,如果是可执行汇编,在Main方法执行前,window会提前读取汇编的头文件(pe32);如果是x86,会打开32位进程;如果是x64,会开启64位进程。
然后在进程空间加载x86或者x64版本或者arm版本的MSCOREE.DLL,然后进程的主线程会调用MSCOREE.DLL的一个方法来初始化Clr,Clr会加载assembly exe然后调用它的入口方法Main。
3.Main方法内部执行
在执行Main之前,Clr将检测该方法引用的所有类型,(Console),然后在内存中分配相应数据类型的空间。这个地址包含这种类型的所有方法信誉,每一项都对应于Clr中的一个JIT编译器。
将调用首次尝试运行Main方法的JIT编译器。在这个方法中,1,负责在方法的实现类型(控制台)的汇编元数据中查询IL方法2,动态分配内存块3,将IL编译成本地Cpu的指令,存储在动态分配的空间中。
4,修改这个条目的地址,以便它指向动态分配的地址。5.跳转到内存块中的本机代码执行,此时会执行IL代码的cpu机器码。
5.在次执行Console.WriteLine的时候,就不会运行JITCompiler,直接运行机器码
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。