Rosyln
上面这段代码在被运行之后,他首先做的第一件事情就是把它这个.CS源代码利用Rosyln编译器把它给转换成二进制文件。这个二进制文件里面包含了控制台类里面的所有信息。非托管部分包含了(数据目录,文件头,以及可选头【实际上这个可选头就是之前COM所占用的虚拟地址和虚拟长度】)托管不分包括(元数据【包括了.net大小版本号以及数据流长度】),数据流【命名空间,函数名,类名。程序集,模块集,方法描述,方法RVA以及返回值,声明类型等等】两个个部分)。一般的所谓IL数据也是通过这个二进制文件获取到的。
CLR
当通过Rosyln编译到了二进制文件之后,这个二进制文件就会被CLR所加载,通过一系列操作之后。(本节介绍的重点)
RyuJit
这个是jit编译阶段,比如CLR加载了一个Rosyln编译的二进制文件里面的函数,那么这函数就会被封装位函数描述符结构体和前置码被传递到RyuJit进行机器码方向的编译,编译完成的结果会修改前置码或则函数描述符结构体的最后一位(至于是那一个,这个东西视乎CLR版本而定)。
以上就是一个整体的编译过程,经过大约四个步骤 Source Code(C#代码)-》Rosyln(IL 代码) -》CLR ->RyuJit。这每一个过程都极其复杂。