c#源碼的執(zhí)行過(guò)程詳解
要講到C#源碼的執(zhí)行過(guò)程 首先要提下程序集,因?yàn)镃lr并不是和托管摸塊打交道的,而是和程序集(dll,exe)
1、從哪里來(lái)
程序集是由一個(gè)或者多個(gè)托管模塊以及 資源文件等共同組成的,C#編譯器(csc.exe)再把源碼編程成IL代碼和元數(shù)據(jù)的時(shí)候,會(huì)進(jìn)一步連同資源文件合并成程序集,
實(shí)際上就是個(gè)PE32文件,里面包含一個(gè)清單文件 和多個(gè)托管模塊和資源(如圖),另外程序集中還有一些自描述信息。

2、執(zhí)行過(guò)程
編譯器生成好程序集以后,如果是可執(zhí)行的程序集,會(huì)在Main方法執(zhí)行之前,window會(huì)預(yù)先讀取程序集的頭文件(pe32),如果是x86則開(kāi)一個(gè)32位的進(jìn)程,x64的就開(kāi)一個(gè)64位的進(jìn)程
然后在進(jìn)程空間里面加載MSCOREE.DLL的x86 或者x64版本或者arm版本,然后進(jìn)程的主線程會(huì)調(diào)用MSCOREE.DLL的一個(gè)方法,初始化Clr,而Clr會(huì)加載程序集exe,再調(diào)用其入口方法Main。
3.Main方法內(nèi)部執(zhí)行
在Main執(zhí)行之前,Clr 會(huì)檢測(cè)出方法引用的所有類(lèi)型,(Console),然后在內(nèi)存中分配對(duì)應(yīng)數(shù)據(jù)類(lèi)型的空間,這個(gè)地址里面包含著這個(gè)類(lèi)型所有的方法聲名,每一項(xiàng)都對(duì)應(yīng)著Clr里面的一個(gè)未編檔函數(shù)(JITCompiler)
首次運(yùn)行Main方法的試試JITCompiler會(huì)被調(diào)用,在這個(gè)方法里面1,負(fù)責(zé)在方法的實(shí)現(xiàn)類(lèi)型中(console)程序集元數(shù)據(jù)中查詢(xún)?cè)摲椒ǖ腎L方法 2,動(dòng)態(tài)分配內(nèi)存塊 3,把IL編譯成本機(jī)Cpu的指令,存儲(chǔ)到動(dòng)態(tài)分配的空間里面
4,修改這個(gè)條目的地址,使它指向動(dòng)態(tài)分配的地址 5.跳轉(zhuǎn)到內(nèi)存塊中的本機(jī)代碼執(zhí)行,這時(shí)候執(zhí)行的就是IL代碼的cpu機(jī)器碼
5.在次執(zhí)行Console.WriteLine的時(shí)候,就不會(huì)運(yùn)行JITCompiler,直接運(yùn)行機(jī)器碼

相關(guān)文章
C#實(shí)現(xiàn)圖形位置組合轉(zhuǎn)換的方法
這篇文章主要介紹了C#實(shí)現(xiàn)圖形位置組合轉(zhuǎn)換的方法,涉及C#使用Matrix操作圖形的相關(guān)技巧,需要的朋友可以參考下2015-06-06
C#實(shí)現(xiàn)軟件監(jiān)控外部程序運(yùn)行狀態(tài)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)軟件監(jiān)控外部程序運(yùn)行狀態(tài)的方法,可實(shí)現(xiàn)監(jiān)控另一個(gè)程序的運(yùn)行狀態(tài)及觸發(fā)相應(yīng)事件的功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-12-12
C# 計(jì)算標(biāo)準(zhǔn)偏差相當(dāng)于Excel中的STDEV函數(shù)實(shí)例
下面小編就為大家?guī)?lái)一篇C# 計(jì)算標(biāo)準(zhǔn)偏差相當(dāng)于Excel中的STDEV函數(shù)實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
C#使用讀寫(xiě)鎖三行代碼簡(jiǎn)單解決多線程并發(fā)的問(wèn)題
本文主要介紹了C#使用讀寫(xiě)鎖三行代碼簡(jiǎn)單解決多線程并發(fā)寫(xiě)入文件時(shí)提示“文件正在由另一進(jìn)程使用,因此該進(jìn)程無(wú)法訪問(wèn)此文件”的問(wèn)題。需要的朋友可以參考借鑒2016-12-12
Unity實(shí)現(xiàn)簡(jiǎn)單虛擬搖桿
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)簡(jiǎn)單虛擬搖桿,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04

