标签:
1.先将不同语言的代码生成托管模块。
如图,每个语言有自己对应的编译器。 和普通编译器不同,这个编译器是生成IL代码,不是直接的机器码。
编译也就是我们平时生成的过程。 f5
c# 调用 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe (我是这个版本,不同版本路径不同) 来编译。
也就是说。其实如果你不VS做开发, 可以只安装 .net Framework,写好代码之后通过它来编译
无视那个警告. 这就编译好了。
他可以是一个 DLL,可以是EXE。
不过都需要CLR才能执行.
具体 CSC详细的参数可以看这里
生成有对应的选项。
x86 能在 windows32位版本上运行
x64 能在 windows64位版本上运行
Any CPU 都兼容
生成时 PE32 或 PE32+头 , 执行的时候 Windows 会检查这个头,来判断程序需要32位地址还是64位地址
编译生成的玩意儿有
CLR 就根据这些信息来生成机器码,分配内存 等等。
2. 执行程序集
程序生成运行时。
CLR 会检测 生成的程序集的所有类型,然后分配内部数据结构,管理引用类型。
数据结构都有地址,对这个结构初始化的时候,会调用 JITCompiler。
JITCompiler 会验证 IL代码,并编译成CPU指令。 然后保存到内存块儿中。
返回内部结构,修改引用。
以上步骤指挥在第一个步骤,只会在第一次执行的时候执行。 以后都直接调用内存里已经编译好的。
JITCompiler 生成的代码会根据硬件来生成特殊指令优化性能。
当有一些大型程序启动慢的时候。你就需要用到 ngen.exe
他就跳过了动态编译这一步,直接编译成机器码。 提高了这部分的性能。
不过也无法享受,动态编译后带来的性能提升。
使用时候需要斟酌。
这流程,在其他操作系统下就可以随意执行IL代码 实现跨平台。 MONO 就是这样来的
标签:
原文地址:http://www.cnblogs.com/HeyTommy/p/4288596.html