如何載入通用語言執行時?

2021-04-21 07:11:42 字數 1321 閱讀 3512

.net程式的生成以及執行過程:

將源**(source code)編譯成為託管模組(managed module)-->將託管模組組合成程式集-->載入clr-->執行程式集**

一、將源**編譯為託管模組

我們可以用任何支援clr的程式語言來建立源**檔案,然後用相應的編譯器來做語法檢查和源**分析,最終生成託管模組。託管模組是乙個需要clr才能執行的標準windows可移植可執行(portable executable,簡稱pe)檔案。

二、將託管模組組合成程式集

clr並不直接和模組打交道,它直接打交道的是程式集(assembly)。

對於程式集,簡言之,有如下特點:

a.程式集是乙個或多個託管模組,以及一些資源檔案的邏輯組合。

b.程式集是元件復用,以及實施安全策略和版本策略的最小單位。    

三、載入clr

主要分為託管exe載入clr和託管dll載入clr。

exe檔案載入clr的過程:

託管exe檔案被呼叫時,windows先載入該檔案,發現其.idata部分記錄了要把mscoree.dll(微軟元件物件執行時執行引擎)載入到程序的位址空間(編譯器在生成託管exe檔案時,x86 stub函式jmp _corexemain被嵌入到了pe檔案的.text部分,而這個函式是從mscoree.dll中匯入的,所以.idata部分會記錄 mscoree.dll).載入了mscoree.dll後,載入器獲得_corexemain函式的位址,同時修正託管exe中的stub函式的jmp 指令。程序的主線程開始執行修正後的x86 stub函式,該函式會跳轉到_corexemain函式上,_corexemain函式開始初始化clr,並檢視可執行程式集的clr表頭以確定要執行的託管入口點方法。隨後il**被翻譯成本地cpu指令。clr跳轉到編譯後的本地cpu指令上,至此,託管應用程式開始真正執行。

託管dll載入clr的過程類似,分為非託管**載入託管dll和託管**載入託管dll。

非託管**載入託管dll:

1、windows載入託管dll,並自動載入mscoree.dll,獲取mscoree.dll中_cordllmain函式的位址,並修正託管dll中x86 stub函式的jmp指令。

2、呼叫loadlibrary載入託管dll的執行緒將跳到x86 stub函式上來,該函式會跳轉到mscoree.dll中的_cordllmain函式上。_cordllmain函式開始初始化clr,然後立即返回,應用程式也返回到正常狀態繼續執行。

注:託管dll中方法的il**只會在非託管**明確呼叫時開始以即時編譯的方法執行。

託管**載入託管dll:

呼叫**會檢查託管dll中的元資料,然後以即時編譯的方式執行其內方法的il**。

型別與通用語言執行時 型別轉換

clr 最重要的乙個特性就是型別安全。clr 在執行時總能知道乙個物件的型別。我們也可以用過呼叫 gettype方法來得到物件的準確型別。因為該方法是乙個虛方法。所以我們不可能利用它來篡改乙個型別的資訊。例如 我們不可能重寫 employee 類的 gettype方法使之返回乙個spaceshutt...

常用語言執行時間計算函式

程式執行cpu的時間,返回值是浮點數 單位 秒 推薦使用 比毫秒表示更為精確 import time start time.clock do things end time.clock print running time s seconds end start cpu time 是當cpu完全被某...

CLR via C 1 3 載入公共語言執行時

原文 clr via c 1.3 載入公共語言執行時 1.你生成的每個程式集可以是exe,也可以是dll。最終都是有clr管理這些程式集中 的執行。2.vs2010中,建立新的exe專案時,預設平台是x86,而不是anycpu。3.windows的64位版本提供了乙個名為wow64 windows ...