c#源码的执行过程详解
2018-07-29 10:40
519 查看
要讲到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,直接运行机器码
您可能感兴趣的文章:
相关文章推荐
- c#源码的执行过程
- Laravel5.5源码详解 -- 一次查询的详细执行:从Auth-Login-web中间件到数据库查询结果的全过程
- C# 执行存储过程
- mybatis源码学习之执行过程分析(0)——配置文件加载(io包)
- c#调用存储过程执行任务超时现象
- 基于C#中的类SqlCommand对象调用SQLServer存储过程时,存储过程执行成功,但是对象方法ExecuteNonQuery()返回-1
- 从源码剖析一个Spark WordCount Job执行的全过程
- twitter storm源码走读之8 -- TridentTopology创建过程详解 - 徽沪一郎
- C#如何执行存储过程
- C#中执行mysql数据库的存储过程
- PHP迭代器的内部执行过程详解
- C#基础语言知识--编译和执行过程(一)
- MyBatis 源码解析:通过源码深入理解 SQL 的执行过程
- SQL语句执行过程详解
- hadoop作业初始化过程详解(源码分析第三篇) 推荐
- 记一次SQL Server2005导入Oracle10G的折腾过程【供多种数据库导入导出数据的C#程序源码参考】
- Hadoop MapReduce执行过程详解(带hadoop例子)
- Mybatis源码详解之接口方法被执行流程源码解析
- Netty5源码分析--1.服务端启动过程详解
- Java 执行过程详解 - JVM 生命周期