一個(gè)典型的C#/.NET應(yīng)用程序的執(zhí)行過(guò)程: 1.用戶執(zhí)行編譯器輸出的應(yīng)用程序(PE文件),操作系統(tǒng)載入PE文件,,以及其他的DLL(.NET動(dòng)態(tài)連接庫(kù)),。 2.操作系統(tǒng)裝載器根據(jù)前面PE文件中的可執(zhí)行文件頭跳轉(zhuǎn)到程序的入口點(diǎn)。顯然,,操作系統(tǒng)并不能執(zhí)行中間語(yǔ)言,,該入口點(diǎn)也被設(shè)計(jì)為跳轉(zhuǎn)到mscoree.dll(.NET平臺(tái)的核心支持DLL)的_ CorExeMain()函數(shù)入口。 3.CorExeMain()函數(shù)開(kāi)始執(zhí)行PE文件中的中間語(yǔ)言代碼,。這里的執(zhí)行的意思是通用語(yǔ)言運(yùn)行時(shí)按照調(diào)用的對(duì)象方法為單位,,用即時(shí)編譯器將中間語(yǔ)言編譯成本地機(jī)二進(jìn)制代碼,執(zhí)行并根據(jù)需要存于機(jī)器緩存,。 程序的執(zhí)行過(guò)程中,,垃圾收集器負(fù)責(zé)內(nèi)存的分配,釋放等管理功能,。 程序執(zhí)行完畢,,操作系統(tǒng)卸載應(yīng)用程序。 NET Framework,,一個(gè)運(yùn)行在操作系統(tǒng)Windows之上的軟件虛擬機(jī),。開(kāi)發(fā)出來(lái)的程序經(jīng)過(guò)編譯之后,生成的可執(zhí)行程序?qū)嶋H上包含的只是MSIL指令代碼,,這是一種托管代碼,,只能運(yùn)行在.NET虛擬機(jī)之上。 托管EXE文件被調(diào)用時(shí),,Windows先加載該文件,,發(fā)現(xiàn)其.idata部分記錄了要把MSCorEE.dll加載到進(jìn)程的地址空間.加載了MSCorEE.dll后,,加載器獲得_CorExeMain函數(shù)的地址,同時(shí)修正托管EXE中的stub函數(shù)的JMP指令,。進(jìn)程的主線程開(kāi)始執(zhí)行修正后的x86 stub函數(shù),,該函數(shù)會(huì)跳轉(zhuǎn)到_CorExeMain函數(shù)上,_CorExeMain函數(shù)開(kāi)始初始化CLR,,并查看可執(zhí)行程序集的CLR表頭以確定要執(zhí)行的托管入口點(diǎn)方法,。隨后IL代碼被翻譯成本地CPU指令。CLR跳轉(zhuǎn)到編譯后的本地CPU指令上,,至此,,托管應(yīng)用程序開(kāi)始真正運(yùn)行。 http://msdn.microsoft.com/zh-cn/library/k5532s8a.aspx |
|