CLR中你想知道的事

CLR是什么?数组

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

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

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

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

Visual Studio为何能够智能感知类的方法和参数?线程

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

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

IL是什么,能干什么?code

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指令的代码。