我想也许要写些东西,记录我做程序员的日子吧

================================================

要讲到C#源码的执行过程 首先要提下程序集,因为Clr并不是和托管摸块打交道的,而是和程序集(dll,exe)

1、从哪里来

程序集是由一个或者多个托管模块以及 资源文件等共同组成的,C#编译器(csc.exe)再把源码编程成IL代码和元数据的时候,会进一步连同资源文件合并成程序集,

实际上就是个PE32文件,里面包含一个清单文件 和多个托管模块和资源(如图),另外程序集中还有一些自描述信息。

2、执行过程

  编译器生成好程序集以后,如果是可执行的程序集,会在Main方法执行之前,window会预先读取程序集的头文件(pe32),如果是x86则开一个32位的进程,x64的就开一个64位的进程

然后在进程空间里面加载MSCOREE.DLL的x86 或者x64版本或者arm版本,然后进程的主线程会调用MSCOREE.DLL的一个方法,初始化Clr,而Clr会加载程序集exe,再调用其入口方法Main。

3.Main方法内部执行

  在Main执行之前,Clr 会检测出方法引用的所有类型,(Console),然后在内存中分配对应数据类型的空间,这个地址里面包含着这个类型所有的方法声名,每一项都对应着Clr里面的一个未编档函数(JITCompiler)

首次运行Main方法的试试JITCompiler会被调用,在这个方法里面1,负责在方法的实现类型中(console)程序集元数据中查询该方法的IL方法 2,动态分配内存块 3,把IL编译成本机Cpu的指令,存储到动态分配的空间里面

4,修改这个条目的地址,使它指向动态分配的地址 5.跳转到内存块中的本机代码执行,这时候执行的就是IL代码的cpu机器码

5.在次执行Console.WriteLine的时候,就不会运行JITCompiler,直接运行机器码

最新文章

  1. Web Worker
  2. 【基础知识】.Net基础加强09天
  3. Hbase快速开始——shell操作
  4. MVVM开源框架Knot.js 教程2 - 大幅改变前端框架开发体验的Debugger
  5. 深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
  6. 《service》-“linux命令五分钟系列”之二
  7. ECLIPSE/MYECLIPSE OPERATES
  8. Arraylist、Linkedlist遍历方式性能分析
  9. C 打印格式小记
  10. 【npm】伙计,给我来一杯package.json!不加糖
  11. Confluence 6 配置数据库查询超时时间
  12. Django项目中自定义manage命令
  13. 自动微分(AD)学习笔记
  14. UIKit Dynamic主题学习笔记
  15. java操作数据库的事务支持
  16. 百度地图API和高德地图API资料集锦
  17. 光源 材质 简析——基于《real time rendering》第三版 第五章
  18. 毫秒级百万数据分页存储过程(mssql)
  19. 【LA2957 训练指南】运送超级计算机【二分,最大流】
  20. 【前端】XHTML入门笔记

热门文章

  1. 文件操作,列表实例NiceHexSpiral
  2. Java语法细节 - 可见性
  3. 了解vue APi
  4. Linux的小知识点
  5. react-native 组件整理
  6. ASP.NET Core知多少(6):VS Code联调Angular + .NetCore
  7. Java两种方法实现循环报数
  8. 字符串----hiho字符串(尺取法)
  9. [Swift]LeetCode21. 合并两个有序链表 | Merge Two Sorted Lists
  10. [Swift]LeetCode162. 寻找峰值 | Find Peak Element