3、加載公共語言運行時中介紹了在安裝了.Net Framework中加載公共語言運行時,公共語言運行時加載程序集的過程.以及經過vs stdio設置源碼編譯的目標平臺的過程.html
本問主要介紹公共語言加載完程序集以後,執行程序集中的代碼的過程.算法
1、IL中間語言編程
一、IL簡介windows
1、源代碼-面向CLR的編譯器-託管模塊-(元數據&IL代碼)中介紹了C#源代碼經過C#編譯器生成的最終產物是託管模塊,而託管模塊是由IL中間語言和元數據組成,IL語言是比大多數機器語言都要高級的語言,IL有如下功能:數組
(1)、能訪問和操做對象類型安全
(2)、提供了指令建立和初始化對象數據結構
(3)、調用對象上的虛方法和操做數組編程語言
(4)、提供了拋出和捕捉異常的指令實現錯誤處理函數
......等等post
所以,可將IL視爲一種面向對象的機器語言.
二、IL通識
(1)、咱們通常經過C#或者F#或者Visual Basic來編程,而後編譯器將它們編譯成IL,而後IL和其餘機器語言同樣,也可使用匯編語言來編寫,MS提供了ILAsm.exe的IL彙編器和ILDasm.exe的反彙編器.
(2)、一般高級語言只提供CLR所有功能的一個子集,然而IL彙編語言容許開發人員方法CLR的所有功能,若是你選擇的編程語言隱藏了一個你迫切須要的功能,那麼你可使用IL彙編語言來實現,或者使用另外一種編程語言來實現
三、CLR執行一個方法時發生的事情
(1)、第一次執行
(2)、第二次執行
若是Main方法第二次調用Console的WriteLine方法,會徹底跳過JITComliler函數,由於第一次已經執行和初始化過了,會執行執行內存塊中的代碼,執行完畢有返回值,則返回到Main(),沒有返回值,則跳轉帶Main方法,進行下一步操做.
注:方法只有在第一次運行時會有JIT進行IL驗證和IL編譯成本機代碼形成的性能損失,之後對該方法的調用都已本機代碼的形式全速運行,無需驗證IL代碼並把它編譯成本地代碼.
四、CLR執行方法時的IL和驗證
(1)、IL基於棧
它的全部指令要將操做數壓入一個執行棧,並從棧中彈出(pop)結果。因爲IL沒有提供操做寄存器的指令,全部人們很容易的建立新的語言和編譯器,生成面向CLR的代碼.
(2)、IL指令"無類型"
例:IL提供了Add指令將壓入棧的最後的兩個操做數加到一塊兒.add指令不分32位和64位版本.當add指令執行時,它判斷棧中的操做數的類型,並執行恰當的操做.
(3)、IL指令最大的優點
IL最大的優點並非對底層的抽象,而是應用程序的健壯性和安全性.將IL編譯成本機CPU指令時,CLR會檢查驗證高級IL代碼,肯定代碼所作的一切操做都是安全的.
例如:會覈實調用的每一個方法都有正確數量的參數,傳給每一個方法的每一個參數都有正確的類型,每一個方法的返回值都獲得了正確的使用,每一個方法都有一個返回語句.
注:託管模塊的元數據包含驗證過程要用到的全部方法及類型信息.
(4)、IL驗證對進程產生的影響
windows的每一個進程都有本身的虛擬地址空間,獨立空間存在的是由於不能簡單的信任一個應用程序的代碼。應用程序徹底可能讀寫無效的內存地址。將每一個Windows進程都放到獨立的地址空間,將得到健壯性和穩定性,一個進程干擾不到另外一個進程.
經過驗證託管代碼,能夠確保代碼不會不正確地訪問內存,不會干擾另外一個應用程序的代碼.這樣就能夠放心地將多個託管應用程序放到同一個Windows虛擬地址空間運行。
注:因爲windows進程須要大量的操做系統資源,因此進程數量太多,會損害性能並制約可用的資源。用一個進程運行多個應用程序,減小進程,加強性能,減小所需的資源,健壯性沒有絲毫降低,這是託管代碼的優點之一.
CLR提供了在一個操做系統進程中執行多個託管應用程序的能力,每一個應用程序都在一個AppDomain中執行,每一個託管Exe文件默認都在它本身的獨立地址空間中運行,這個地址空間已有一個AppDomain.
注:IIS和SQL Server可實如今一個進程中運行多個AppDomain.
五、CLR執行不安全的代碼
C#編譯器默認生成安全的代碼,代碼的安全性能夠驗證,然而C#編譯器也容許開發人員寫不安全的代碼,不安全的代碼容許直接操做內存,並可操做這些地址處的字節。這是一個很強大的功能,不過通常是在提高一個對效率要求極高的算法的時候使用。
然而,使用不安全的代碼存在重大風險,這種代碼可能會破壞數據結構,危害安全性,甚至形成新的安全漏洞,因此,C#編譯器要求不安全的代碼都使用unsafe關鍵字標記.
注:當JIT編譯器編譯一個unsafe方法時,該程序集必須有System.Security.Permissions.SecurityPermission權限.且System.Security.Permissions.SecurityPermissionFlagd的SkipVerification的標誌是否設置,若是設置了,JIT編譯器會便宜unsafe的代碼.
MS提供了PEVerify.exe的程序,用它檢查一個程序集的全部方法,並報告其中不安全代碼的方法.
六、實現IL代碼驗證的技術
JIT驗證IL代碼時.必需要訪問全部以來的程序集中包含的元數據.例如:當PEVerify檢查程序集時,它必須可以定位並加載應用的全部的程序集.
CLR是採用和平時執行程序集時同樣的綁定和探測規則來定位程序集.