直播中
這里是一個簡單的回答:當你編譯一個C#應(yīng)用程序或任何一種CLS(Commmon
Language Specification)兼容的語言時,它將首先被編譯成一種稱為IL
(Intermediate Language)的偽代碼(pseudo-code)。在這個應(yīng)用程序第一次
被運行的時候,這種IL代碼將被編譯成機器代碼,用于執(zhí)行。也就是說從源代碼
到得到運行結(jié)果,進行了兩次編譯。事實上,只有那些被真正使用的函數(shù)代碼
才會被進行第二次編譯。下面揭示開發(fā)過程中被隱藏起來的細節(jié):
1) 你用C#開發(fā)一些程序
2) 用C#編譯器或CLS兼容的編譯器編譯成EXE
3) 編譯器將生成的IL代碼和附加信息(manifest)放入擁有一個標準PE頭的Win32
可執(zhí)行文件的只讀部分。
4) 編譯器在創(chuàng)建這個可執(zhí)行文件時導(dǎo)入(import)一個名為_CorExeMain的函數(shù)。
這個函數(shù)是.NET EE(execution engine)--.NET運行期引擎的入口函數(shù)。
5) 當執(zhí)行這個Win32可執(zhí)行文件時,因為其主要是依賴于DLL的PE文件,操作系
統(tǒng)將會調(diào)用位于MSCorEE.DLL中的_CorExeMain函數(shù)。
6) 操作系統(tǒng)通過PE文件里的進入點,調(diào)用MSCorEE.DLL。并能保證在Windows里
可以有很多程序同時運行。
7) 因為操作系統(tǒng)不能執(zhí)行.NET IL代碼,EXE里的進入點只是簡單的中介,它將
指示操作系統(tǒng)調(diào)用_CorExeMain函數(shù)。
8) 隨后_CorExeMain函數(shù)開始解釋位于PE文件中的IL代碼。
9) 因為IL是不能被直接執(zhí)行的, .NET EE使用稱為JITter (Just In Time compiler)
的即時編譯器將IL代碼編譯成本地CPU機器代碼用于執(zhí)行。這一即時編譯過程
只在第一次執(zhí)行的時候進行。