CLR執行的模型是從代碼開始,通過編譯器生成託管模塊,默認狀況下可讓多個託管模塊和資源生成程序集。下圖爲其大體過程。html
當系統運行託管模塊時會檢查文件頭,判斷啓用一個32位的進程仍是64位的,而後會在其進程中加載對應的MsCorEE.dll,裏面有個初始化CLR的一個方法,初始完CLR,加載程序集,進入程序入口方法。在執行Main方法以前,爲了能讓電腦運行程序,CLR必須讓IL程序集轉化成指令。首先CLR會創建一個內部的數據結構,用於管理IL方法對CLR的訪問,若是函數是第一次對其CLR的訪問,那麼對應的JIT會讓程序集的對應的IL方法經過CLR轉化成了指令,而後JIT把指令的地址告訴指向本身的方法,以便之後IL方法能夠直接指到電腦上的指令,從而減小像第一次的經過JIT獲得指令的過程。大體的圖以下數據結構
下面主要介紹幾個與CLR有關的常見概念:主要包括程序集,託管模塊,CLR,FCL,CLS,CTS。編輯器
其中PE32(+)頭主要標模塊的文件類型,生成時間等。還包括了與cpu代碼中的信息,如生成代碼時適用於32仍是64的cpu以及任何的cpu。函數
CLR頭主要包含了須要的CLR版本,託管程序入口的方法(Main方法)MethodDef元數據標識,以及自身的元數據、資源、強名稱等。.net
元數據主要包括託管模塊的元數據表,主要是自身的類型定義信息,引用類型信息,若是是一個是單獨程序集,還包括程序集的信息,下一篇會着重介紹。orm
IL代碼當源代碼經過編譯後,就會生成IL代碼。IL代碼經過CLR中的JIT才能轉化成CPU指令。htm
程序集:多是多個託管模塊和資源組成,固然也能夠是單個模塊組成。blog
其餘的幾個就用下面的比喻類解釋進程
菜譜:它是基於通用語言基礎架構(Common Language Infrastructure,CLI)。它就像一本江湖上失傳已久的菜譜。
廚師:通用語言運行平臺(Common Language Runtime,CLR),是對CLI這個架構在Windows平臺的實現。簡單地理解就是CLR這個廚師,讓CLI這本菜譜發揮了其真正的做用。
下面咱們來嚐嚐這些佳餚:
食物:類庫(Framework Class Library,FCL),全部在.NET可以使用的類庫。分爲兩部分,一部分爲原料,另外一部分爲成品菜。
餐具:公共語言規範Common Language Specification (CLS) 和公共類型系統Common Type System (CTS) ,是CLI的一部份內容,它們的目的是保證各類語言與.NET Framework的兼容性的。就好像有的食客習慣用筷子,有的則喜歡用叉子,像八戒就用九齒釘耙。有了CLS和CTS,各路食客就能使用本身喜歡用的餐具吃上可口的食物了。例如:把C#中的int和VB中的Integer統一映射到System.Int32。
食客:各類語言,C#,VB,等等。
C#項目->編譯成->程序集(IL)——>CLR中的及時語言編輯器->爲cup的指令。
本文主要介紹了CLR執行模型和經常使用的幾個概念。但願能從整體上認識一下.net。菜鳥若是有不對的地方,但願你們多多指教!
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