我想也許要寫些東西,記錄我作程序員的日子吧程序員
================================================編程
要講到C#源碼的執行過程 首先要提下程序集,由於Clr並非和託管摸塊打交道的,而是和程序集(dll,exe)函數
一、從哪裏來spa
程序集是由一個或者多個託管模塊以及 資源文件等共同組成的,C#編譯器(csc.exe)再把源碼編程成IL代碼和元數據的時候,會進一步連同資源文件合併成程序集,線程
實際上就是個PE32文件,裏面包含一個清單文件 和多個託管模塊和資源(如圖),另外程序集中還有一些自描述信息。blog
二、執行過程進程
編譯器生成好程序集之後,若是是可執行的程序集,會在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,直接運行機器碼