c#代码是怎么运行的:
c#代码=》编译器=》DLL/EXE=>CLR/JIT=>机器码
最后到二进制的时候是这么执行的???
要知道更具体细节,可以参考书籍《CLR VIA C#》
转自:c#编译后是怎么运行的
1..NET语言的编译器接受源代码文件,并生成名为程序集的输出文件。
程序集要么是可执行的,要么是DLL
程序集里的代码并不是本机代码,而是一种名称为CIL的中间语言
程序集包含如下信息:
程序的CIL
程序中使用的类型的元数据
对其他程序集引用的元数据
2. 程序的编译过程
程序的CIL直到它被调用运行时才会被编译成本机代码。在运行时,CLR执行下面步骤:
检查程序集的安全特性
在内存中分配空间
把程序集中的可执行代码发送给实时编译器(JIT),把其中的一部分编译成本机代码。
程序集中的可执行代码只在需要的时候由JIT编译器进行编译,然后它就被缓存起来以备在后来的程序中执行。这就意味着不被调用的代码不会被编译成本机代码,而且被调用的代码只被执行一次。
一旦CIL被编译成本机代码,CLR就在它运行时管理它,执行像内存释放、数组边界检查、检查参数类型、异常管理等任务。有两个重要的术语由此而生。
托管代码:为.NET框架编写的代码称为托管代码,需要CLR
非托管代码:不在CLR控制下运行的代码,比如Win32 C/C++ DLL,称为非托管代码
当您的C#代码编译后.他会变成EXE 此时会被编译为中间语言.通过.NET框架进行执行语句
实例化时发生了什么:
实例化创建对象
AA b new=AA()
使用AA类声明创建爱了一个 a 变量,也可以用var代替AA,如:var x=new AA()
AA()的时候调用了XX类的默认无参构造函数,如果使用AA(参数)会调用对应有参数的构造函数
实例化类执行顺序:静态==》实例==》构造, 不管有没有基类,本类的构造函数都是最后执行的,执行到基类的时候基类的构造函数也是最后执行的。
注意:实例化类时,只有在类的一级目录下的实例才会被执行,如果在没有被调用的方法的实例,是不会执行的
不含基类的执行顺序:静态对象==》实例成员==>构造函数
- 静态字段被实例化。
- 静态构造函数被调用。
- 实例成员字段被实例化。
- 对象构造函数被调用。
包含基类的执行顺序:本类静态对象、实例成员==》基类静态对象、构造函数==》本类构造函数
- 本类静态字段被实例化。
- 本类静态构造函数被调用。
- 本类实例成员字段被实例化。
- 基类静态字段被实例化。
- 基类静态构造函数被调用。
- 基类实例成员字段被实例化。
- 基类构造函数被调用。
- 本类构造函数被调用。
参考:
实例化数组:
静态对象(类、方法、变量、属性)的原理:
静态对象是直接调用而不需要实例化的,
实例化时静态对象是首先执行的
值类型和引用类型,引用和调用、创建的区别???