在解释C#代码编译过程之前,先来说明一下什么是托管语言,什么是非托管语言。
1.实际上这个问题并没有明确的界限,简单的说非托管语言编译器直接产生二进制代码,例如C/C++。托管语言经由编译器产生中间代码(IL代码),再经过JIT(Just In Time)编译器编译成机器码。
2.C#语言编译的过程如图所示。源代码经过编译生成IL代码和元数据存储在生成的DLL/EXE文件中。CLR(Common Language Runtime)公共语言运行时为JIT编译器提供了运行环境,IL代码再由JIT编译生成机器所能执行的代码。
程序及是一个或多个模块/资源文件的逻辑性分组,是重用、安全性以及版本控制的最小单元,程序集包含程序的名称,版本号,自我描述,文件关联关系和文件位置等信息。在.net框架中通过Assembly类来支持,该类位于System.Reflection下,物理位置位于:mscorlib.dll。
CSC.exe可以将多个托管模块整合成一个程序集,只有一个托管模块且无资源文件的项目,程序集就是托管模块。每次加载程序集CLR和windows都需要花费一定时间查找、加载和初始化程序及。需要加载的程序集越少有利于减少工作集,性能越好。
程序集的三个好处:不同的类型用不同的文件,可以使文件以增量方式下载。
程序集中可以添加资源或数据文件。
程序集包含各个类型可以用不同的编程语言实现。
JITCompiler是CLR的一个组件,实质是clr内部的一个未编档函数,当一段代码首次被调用时,CLR分配一个内部数据结构,这个数据结构会有一个记录项,JITCompiler函数会被调用,JIT会在程序集中查找并验证被调用IL代码,将其编译成本机CPU指令,并将其保存到动态分配的内存块中,修改调用方法的对应的记录项,使其指向内存块,然后跳转到内存块中对应的代码执行。第二次调用时候,直接跳过JITCompiler函数,直接执行内存块内的代码。
CTS一个描述类型的定义和行为的规范,已经和.net framwork的其他组件组合成CLI公共语言基础结构。CLS公共语言规范,详细定义一个最小功能集。只有支持CLS才能兼容其他CLS\\CLR语言生成组件,是CLR/CTS的一个子集。
元数据是由几个表构成的二进制数据块,分别是定义表,引用表和清单表。