1. 托管程序集同时包含元数据和IL。IL是与CPU无关的机器语言。可将IL是为一种面向对象的机器语言。
2. IL也是能使用汇编语言来写的,MicroSoft专门提供了一个名为ILAsm.exe的IL汇编器和一个名为ILDasm.exe的IL反汇编。3. 高级语言只公开了CLR的所有功能的一个子集,IL汇编语言允许开发人员访问CLR的所有功能。如果你需要当前使用的语言不支持的CLR功能,可以使用IL语言或者其他CLR语言。4. 为了执行一个方法,首先必须将它的IL转换成为本地CPU指令,这是CLR的JIT(just-in-time或"即时")编译器的职责。5. 展示一个方法首次调用发生的事情。①在Main方法执行之前,CLR会检测出Main的代码引用的所有类型。这会使CLR分配一个内部数据结构,用于管理对所引用的类型的访问。图1-4中,Main方法引用了一个Console类型(或就叫做Console类),这将让CLR分配一个内部结构。在这个结构中,Console类型定义的每个方法都有一个相对应的记录项。每一个记录项都容纳一个地址(但目前还是没有的,还没到这一步),根据地址即可找到方法的实现。②初始化CLR分配了一个内部结构,CLR将每个记录项都设置成包含在CLR内部的一个未文档化的函数(就理解成未公开的,只有微软自己清楚的函数)。姑且就将这个函数命名为JITCompiler(MSDN找不到这个函数,为了说明流程,自己取的函数名,因为真正的函数名微软没公开)③Main方法首次调用WriteLine时,JITCompiler也就被调用了。JIT函数负责将一个方法的IL代码编译成本地CPU指令。由于IL是"即时"编译的,所有通常将这个组件成为JIT编译器或JITter。④JITCompiler函数被调用时,它知道要调用的是哪个方法,以及具体是什么类定义了该方法。于是乎,JITCompiler会在定义该类型的程序集的元数据中查找被调用的方法的IL。⑤接着就是验证IL代码,并将IL编译成为本地CPU指令。本地CPU指令被保存到了一个动态分配的内存块中。⑥然后,JITCompiler在CLR为类型创建的内部数据结构,找到与被调用的方法对应的那一条记录项,修改最初对JITCompiler的引用,让它现在指向内存块(其中包括了刚才编译好的本地CPU指令)的地址。⑦最后,JITCompiler函数跳转到内存块中的代码,继续执行里面的具体的功能代码,这些代码执行完后,会返回到Main中,并像往常一样继续执行。新闻热点
疑难解答