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