c#源碼的執(zhí)行過程詳解
要講到C#源碼的執(zhí)行過程 首先要提下程序集,因?yàn)镃lr并不是和托管摸塊打交道的,而是和程序集(dll,exe)
1、從哪里來
程序集是由一個(gè)或者多個(gè)托管模塊以及 資源文件等共同組成的,C#編譯器(csc.exe)再把源碼編程成IL代碼和元數(shù)據(jù)的時(shí)候,會進(jìn)一步連同資源文件合并成程序集,
實(shí)際上就是個(gè)PE32文件,里面包含一個(gè)清單文件 和多個(gè)托管模塊和資源(如圖),另外程序集中還有一些自描述信息。
2、執(zhí)行過程
編譯器生成好程序集以后,如果是可執(zhí)行的程序集,會在Main方法執(zhí)行之前,window會預(yù)先讀取程序集的頭文件(pe32),如果是x86則開一個(gè)32位的進(jìn)程,x64的就開一個(gè)64位的進(jìn)程
然后在進(jìn)程空間里面加載MSCOREE.DLL的x86 或者x64版本或者arm版本,然后進(jìn)程的主線程會調(diào)用MSCOREE.DLL的一個(gè)方法,初始化Clr,而Clr會加載程序集exe,再調(diào)用其入口方法Main。
3.Main方法內(nèi)部執(zhí)行
在Main執(zhí)行之前,Clr 會檢測出方法引用的所有類型,(Console),然后在內(nèi)存中分配對應(yīng)數(shù)據(jù)類型的空間,這個(gè)地址里面包含著這個(gè)類型所有的方法聲名,每一項(xiàng)都對應(yīng)著Clr里面的一個(gè)未編檔函數(shù)(JITCompiler)
首次運(yùn)行Main方法的試試JITCompiler會被調(diào)用,在這個(gè)方法里面1,負(fù)責(zé)在方法的實(shí)現(xiàn)類型中(console)程序集元數(shù)據(jù)中查詢該方法的IL方法 2,動態(tài)分配內(nèi)存塊 3,把IL編譯成本機(jī)Cpu的指令,存儲到動態(tài)分配的空間里面
4,修改這個(gè)條目的地址,使它指向動態(tài)分配的地址 5.跳轉(zhuǎn)到內(nèi)存塊中的本機(jī)代碼執(zhí)行,這時(shí)候執(zhí)行的就是IL代碼的cpu機(jī)器碼
5.在次執(zhí)行Console.WriteLine的時(shí)候,就不會運(yùn)行JITCompiler,直接運(yùn)行機(jī)器碼
上一篇:C#使用后臺線程BackgroundWorker處理任務(wù)的總結(jié)
欄 目:C#教程
下一篇:如何使用C#代碼創(chuàng)建快捷方式文件詳解
本文標(biāo)題:c#源碼的執(zhí)行過程詳解
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5127.html
您可能感興趣的文章
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并打開的方法
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#停止線程的方法
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動新聞效果的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實(shí)現(xiàn)多線程下載文件的方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子