CLR中你想知道的事

CLR是什么?

CLR 公共语言运行时,是一个可由多个语言共同使用的运行环境,核心(内存管理,程序集加载,安全性,异常处理和多线程)

Visual Studio是一种编译器,编译器也可称为语法检查器和正确代码的分析器

Visual Studio点击生成或调试的时候干了什么?

编译器会生成一个托管模块。托管模块是一个可移植执行体(PE32)文件,如果是64位则是可移植执行体(PE32+)文件

Visual Studio为什么可以智能感知类的方法和参数?

托管模块组成包括,PE32或PE32+头,CLR 头,元数据,IL代码,重点就在元数据上,元数据是一个数据表集合,数据表中描述了模块中定义了什么,包括类型和成员,另一些描述了模块里面引用了什么,包括引用的类型和成员,而且生成的元数据和代码是绑定到一起的,所以元数据和他的描述的IL代码就能永远同步。

元数据用途:1.避免对原生C/C++头和库文件的需求 2.智能感知方法还有参数 3.代码验证,确保类型安全 4.允许对象序列化到内存块 5.允许垃圾回收期跟踪对象生存期

IL是什么,能干什么?

IL是一种高级机器语言,IL代码又被称为托管代码,是Microsoft作者们费尽心思地跟很多编译器作者们请教之后的产物,能访问和操作对象类型,并提供指令来创建和初始化对象、调用对象上的虚方法以及直接操作数组元素、还提供了抛出和捕获异常的指令来实现错误处理,

编译成IL代码之后会再次编译,最终生成能被CPU识别的机器指令,然后执行。

IL如何执行?

说到执行,首先要提到编译,IL编译要用到JIT编译器,JIT编译之后的入口函数称为JITCompiler,如何编译得到JITCompiler函数,请看下面这个代码:

static void Main(string[] args)
{
       Console.WriteLine("HelloWorld");
}

执行步骤如下:

1.在负责实现类型(Console)的程序集的元数据中查找被调用的方法(WriteLine)

2.从元数据中获取该方法的IL

3.分配内存块

4.将IL编译成本机CPU指令,然后将这些本机代码存储到步骤3分配的内存中

5.在Type表中修改与方法对象的条目,使它指向步骤3分配的内存块

5.跳转到内存块中的本机代码

为什么说C++牛逼?

C++编译器是独一无二的,它是唯一允许开发人员同时写托管和非托管代码,并生成到同一个模块中。

PDB文件有什么用?

Visual Studio当使用debug模式的时候会再Debug文件夹中生成PDB文件,PDB文件可以帮助调试器查找到局部变量并将IL指令映射到源代码,进行调试。

托管代码和非托管代码的区别?

托管代码简单说就是需要经过CLR二次编译的代码,非托管代码就是可以直接编译成CPU指令的代码。

posted @ 2019-06-12 16:48  技术宅的化身  阅读(331)  评论(0编辑  收藏  举报