要講到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,直接運行機器碼
原文鏈接:https://www.cnblogs.com/wupo/p/9373564.html