公共語言執行時(common language runtime,clr)是乙個可由多種程式語言使用的「執行時」。它負責在執行時管理**,提供記憶體管理、異常處理、執行緒管理等核心服務,同時又確保**的安全性和準確性。
原始碼的編譯過程如圖所示,使用支援clr的語言建立源**檔案,然後通過相應的編譯器對原始碼進行語法檢查和分析,生成託管模組。託管模組主要由4部分組成:pe32或pe32+頭、clr頭、元資料、il**。
託管模組的組成部分及說明:
組成部分
說明pe32或pe32+頭
標準的windows pe檔案頭,標識出了檔案使用何種格式、檔案型別、生成時間等資訊
clr頭
包含使用這個模組成為託管模組的資訊
元資料
主要有兩種表:描述源**中定義的型別和成員;描述源**引用的型別和成員
il**
編譯器編譯源**時生成的**
##將託管模組合併成程式集
clr實際不和託管模組工作,它和程式集工作。程式集是乙個或多個模組/資源檔案的邏輯性分組。程式集是重用、安全性以及版本控制的最小單元。下圖展示了一些託管模組和資源檔案交由乙個工具處理,生成代表檔案邏輯分組的乙個pe32(+)檔案的過程。
##載入公共語言執行時
windows檢查可執行檔案的檔案頭,決定建立32位還是64位程序,在程序位址空間載入對應版本的mscoree.dll檔案,呼叫mscoree.dll中的方法初始化clr,引導程式集,隨後呼叫其入口方法,啟動並執行託管應用程式。
##執行程式集的**
為了執行程式集的**,首先要把方法的il轉換為本機cpu指令。這是clr的jit(just-in-time)編譯器的職責。下圖展示了方法呼叫的執行過程。
執行步驟:
在main方法執行之前,clr會檢測出main的**引用的所有型別。使clr分配乙個內部資料結構來管理對引用型別的訪問(ii),在這個資料結構中,console類定義的每個方法都有一條對應的記錄,每條記錄都含有乙個位址,根據此位址即可找到方法的實現。對這個結構初始化時,clr將每個記錄項都設定成包含在clr內部的乙個未編檔函式,我們稱之為jitcompiler。
main方法首次呼叫writeline時,jitcompiler函式被呼叫,執行iii中的操作。
**執行完畢後,回到main中,繼續執行下一條語句。
由於步驟2中已經對writeline的**進行了驗證和編譯,所以會直接執行記憶體塊中的**,完全跳過jitcompiler函式。
由以上步驟可知:
方法僅在第一次被呼叫時才有一些效能損失。以後的呼叫都以本機**的形式全速執行。
jit編譯將本機cpu指令儲存在動態記憶體中。也就是說,一旦應用程式關閉,編譯好的**也會丟失。
##本機**生成器:ngen.exe
使用.net framework提供的ngen.exe工具,可以在應用程式安裝時,將il**編譯成本機**。
優點:提高應用程式的啟動速度。因為已經編譯成本地**,執行時不再需要花費時間編譯il**
減小應用程式的工作集。ngen.exe將il編譯成本機**,並將這些**儲存到單獨的資料夾中,該檔案通過「記憶體對映」的方式,同時對映到多個程序位址空間中,使**得到共享,避免每個程序都需要乙份單獨的**拷貝
缺點:沒有智財權保護
ngen生成的檔案可能失去同步
較差的執行時效能
##framework類庫
.net framework包含framework類庫(framework class library,fcl)。fcl是一組程式集的統稱。以下是常用的fcl命名空間:
命名空間
內容說明
system
包含每個應用程式都要用到的所有基本型別
system.data
包含用於和資料庫通訊以及資料處理的型別
system.io
包含用於執行流i/o以及瀏覽目錄/檔案的型別
system.net
包含進行低階網路通訊,並與一些常用internet協議協作的型別
system.runtime.interopservice
包含允許託管**訪問非託管作業系統平台功能
system.security
包含用於保護資料和資源的型別
system.text
包含處理各種編碼文字的型別
system.threading
包含用於非同步操作和同步資源訪問的型別
system.xml
包含用於處理xml架構和資料的型別
##通用型別系統
clr一切圍繞型別展開。通用型別系統(common type system,cts)是microsoft制定的一套用來描述型別的定義和行為的規範。
通用型別系統的功能:cts規範規定,乙個型別可以包含零個或多個成員(字段,方法,屬性,事件)。另外,cts還指定了型別的可見性規則以及型別成員的訪問規則。除此之外,cts還為型別基礎、虛方法、物件生存期等定義了響應的規則。
##公共語言規範
要建立從其他程式語言中訪問的型別,只能從自己的語言中挑選其他語言都支援的功能。microsoft定義了公共語言規範(common language specification,cls),它詳細定義了最小的功能集。
cls定義的是clr/cts功能的乙個子集。
clr支援三種互操作情形:
CLR執行模型
clr common language runtime 公共語言執行時,是乙個可由多種程式語言使用的 執行時 在執行時,clr根本不關心開發人員用的是哪一種語言來變寫 它只關注語言是否是面向clr 面向執行時 的.記憶體管理 程式集載入 安全性 異常處理和執行緒同步。3 如圖 無論是用的是哪一種編譯...
CLR執行模型
然後,將若干個託管模組合併成assembly.載入clr 在 system32 下有mscoreee.dll 說明已經安裝.首次執行一方法 在執行 main 之前,clr 建立乙個內部 ds來儲存 code 所引用的 type.呼叫方法時 jit complier將il 編譯為本地指令 在 am的元...
CLR的執行模型
第一章 clr的執行模型 本章內容 microsoft net framework引入了許多新概念 技術和術語。本章概述了.net framework如何設計,介紹了framework包含的一些新技術,並定義了今後要用到的許多術語。還要展示如何將源 生成為乙個應用程式,或者生成為一組可重新分發的元件...