CLR執行模型與常見的幾個概念

1、CLR執行模型

1.1從代碼到程序集

CLR執行的模型是從代碼開始,通過編譯器生成託管模塊,默認狀況下可讓多個託管模塊和資源生成程序集。下圖爲其大體過程。html

image

1.2執行程序集

當系統運行託管模塊時會檢查文件頭,判斷啓用一個32位的進程仍是64位的,而後會在其進程中加載對應的MsCorEE.dll,裏面有個初始化CLR的一個方法,初始完CLR,加載程序集,進入程序入口方法。在執行Main方法以前,爲了能讓電腦運行程序,CLR必須讓IL程序集轉化成指令。首先CLR會創建一個內部的數據結構,用於管理IL方法對CLR的訪問,若是函數是第一次對其CLR的訪問,那麼對應的JIT會讓程序集的對應的IL方法經過CLR轉化成了指令,而後JIT把指令的地址告訴指向本身的方法,以便之後IL方法能夠直接指到電腦上的指令,從而減小像第一次的經過JIT獲得指令的過程。大體的圖以下數據結構

image當應用程序終止時,再次啓動還須要jit的轉化過程。架構

2、CLR常見的幾個概念

下面主要介紹幾個與CLR有關的常見概念:主要包括程序集,託管模塊,CLR,FCL,CLS,CTS。編輯器

2.1託管模塊:主要由PE32(+)頭,CLR頭,元數據,IL代碼組成

其中PE32(+)頭主要標模塊的文件類型,生成時間等。還包括了與cpu代碼中的信息,如生成代碼時適用於32仍是64的cpu以及任何的cpu。函數

CLR頭主要包含了須要的CLR版本,託管程序入口的方法(Main方法)MethodDef元數據標識,以及自身的元數據、資源、強名稱等。.net

元數據主要包括託管模塊的元數據表,主要是自身的類型定義信息,引用類型信息,若是是一個是單獨程序集,還包括程序集的信息,下一篇會着重介紹。orm

IL代碼當源代碼經過編譯後,就會生成IL代碼。IL代碼經過CLR中的JIT才能轉化成CPU指令。htm

2.2程序集

程序集:多是多個託管模塊和資源組成,固然也能夠是單個模塊組成。blog

其餘的幾個就用下面的比喻類解釋進程

菜譜:它是基於通用語言基礎架構(Common Language Infrastructure,CLI)。它就像一本江湖上失傳已久的菜譜。

廚師通用語言運行平臺(Common Language Runtime,CLR),是對CLI這個架構在Windows平臺的實現。簡單地理解就是CLR這個廚師,讓CLI這本菜譜發揮了其真正的做用。

下面咱們來嚐嚐這些佳餚:

食物類庫(Framework Class Library,FCL),全部在.NET可以使用的類庫。分爲兩部分,一部分爲原料,另外一部分爲成品菜

  • 原料基類庫Base Class Library(BCL),顧名思義,其中包含一些基礎的類,如:IO,String,Net等等。它們是作菜所必需的原料,固然也能夠直接吃。
  • 成品菜FCL中的其餘類。這些類庫基本上都是引用BCL,在這些類庫的基礎上作的擴充。如:ADO.NET,ASP.NET,Windows.Forms等等,它們是咱們編寫程序更加方便,專注。

餐具公共語言規範Common Language Specification (CLS)公共類型系統Common Type System (CTS) ,是CLI的一部份內容,它們的目的是保證各類語言與.NET Framework的兼容性的。就好像有的食客習慣用筷子,有的則喜歡用叉子,像八戒就用九齒釘耙。有了CLSCTS,各路食客就能使用本身喜歡用的餐具吃上可口的食物了。例如:把C#中的int和VB中的Integer統一映射到System.Int32。

食客:各類語言,C#,VB,等等。

3、總結

C#項目->編譯成->程序集(IL)——>CLR中的及時語言編輯器->爲cup的指令。

本文主要介紹了CLR執行模型和經常使用的幾個概念。但願能從整體上認識一下.net。菜鳥若是有不對的地方,但願你們多多指教!

4、參考資料

http://www.cnblogs.com/eshizhan/archive/2010/01/26/1657041.html

《CLR via C#》

http://www.cnblogs.com/JimmyZhang/archive/2012/11/27/2790759.html

相關文章
相關標籤/搜索