c#源碼的執(zhí)行過程詳解
要講到C#源碼的執(zhí)行過程 首先要提下程序集,因為Clr并不是和托管摸塊打交道的,而是和程序集(dll,exe)
1、從哪里來
程序集是由一個或者多個托管模塊以及 資源文件等共同組成的,C#編譯器(csc.exe)再把源碼編程成IL代碼和元數(shù)據(jù)的時候,會進一步連同資源文件合并成程序集,
實際上就是個PE32文件,里面包含一個清單文件 和多個托管模塊和資源(如圖),另外程序集中還有一些自描述信息。
2、執(zhí)行過程
編譯器生成好程序集以后,如果是可執(zhí)行的程序集,會在Main方法執(zhí)行之前,window會預先讀取程序集的頭文件(pe32),如果是x86則開一個32位的進程,x64的就開一個64位的進程
然后在進程空間里面加載MSCOREE.DLL的x86 或者x64版本或者arm版本,然后進程的主線程會調(diào)用MSCOREE.DLL的一個方法,初始化Clr,而Clr會加載程序集exe,再調(diào)用其入口方法Main。
3.Main方法內(nèi)部執(zhí)行
在Main執(zhí)行之前,Clr 會檢測出方法引用的所有類型,(Console),然后在內(nèi)存中分配對應數(shù)據(jù)類型的空間,這個地址里面包含著這個類型所有的方法聲名,每一項都對應著Clr里面的一個未編檔函數(shù)(JITCompiler)
首次運行Main方法的試試JITCompiler會被調(diào)用,在這個方法里面1,負責在方法的實現(xiàn)類型中(console)程序集元數(shù)據(jù)中查詢該方法的IL方法 2,動態(tài)分配內(nèi)存塊 3,把IL編譯成本機Cpu的指令,存儲到動態(tài)分配的空間里面
4,修改這個條目的地址,使它指向動態(tài)分配的地址 5.跳轉(zhuǎn)到內(nèi)存塊中的本機代碼執(zhí)行,這時候執(zhí)行的就是IL代碼的cpu機器碼
5.在次執(zhí)行Console.WriteLine的時候,就不會運行JITCompiler,直接運行機器碼
相關(guān)文章
C# WebApi+Webrtc局域網(wǎng)音視頻通話實例
這篇文章主要為大家詳細介紹了C# WebApi+Webrtc局域網(wǎng)音視頻通話實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07關(guān)于javascript冒泡與默認事件的使用詳解
本篇文章是對javascript中冒泡與默認事件的使用進行了詳細的分析介紹,需要的朋友參考下2013-05-05C#中Monitor對象與Lock關(guān)鍵字的區(qū)別分析
這篇文章主要介紹了C#中Monitor對象與Lock關(guān)鍵字的區(qū)別,需要的朋友可以參考下2013-06-06