我想也許要寫些東西,記錄我做程式設計師的日子吧

================================================

要講到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,直接執行機器碼