CLR via C#:CLR執行模型

基礎知識點:如下所示:
1.Windows的CPU架構類型主要分爲32位的x86以及ARM和64位的x64。
2.x64 Windows通過WoW64技術運行x86 Windows應用程序。
3.PE32表示32位可移植執行體文件;PE32+表示64位可移植執行體文件。
4.如果機器上含有MSCorEE.dll庫文件的話,就表明機器上安裝了.Net Framework。其中Windows爲x86,x64以及ARM的MSCorEE.dll文件存放在%SystemRoot%/System32目錄下;而使用WoW64技術的MSCorEE.dll文件存放在%SystemRoot%/Wow64目錄下。
5.32位Windows的.Net Framework版本存放在%SystemRoot%/Microsoft.NET/Framework目錄下;64位Windows的.Net Framework版本存放在%SystemRoot%/Microsoft.NET/Framework64目錄下。
6.程序集是佔用一個單獨的進程,每個程序集之間互相獨立運行。

CLS,CTS,CLR之間的關係:如下所示:
1.CLS也叫做公共語言規範,用來定義編譯器支持的最小功能子集。在C#中可以使用[assembly:CLSCompliant(true)]特性來告訴編譯器檢查程序集中任何public類型是否在其他編程語言中可以正常訪問。
2.CTS也叫做公共類型系統,用來描述類型的定義和行爲。具有以下特性:
1>.指定類型可以擁有0或者多個成員。如:方法,屬性(get,set),字段和事件。
2>.指定類型的可見性規則和類型中成員的訪問規則。如:public,private等。
3>.指定類型繼承,虛方法,對象生存週期的規則。
4>.指定所有類型必須從System.Object類型繼承。
3.CLR也叫做公共語言運行時,只要編程語言(C#,Lua,IL彙編等)是面向CLR規範的,那麼這些編程語言也就具有CLR中定義的部分或者全部能力(內存管理,程序及加載,安全性,異常處理和線程同步等)。
4.CLR/CTS提供了一個功能集;不同的編程語言(C#,Lua,IL彙編等)提供了CLR/CTS的部分或者全部功能實現,而這些編程語言都會提供CLS提供功能的全部實現。如圖所示:
在這裏插入圖片描述
託管執行過程:如下所示:
1.使用C#編寫源代碼文件。
2.使用C#編譯器將C#源代碼文件編譯成託管模塊。
1>.編譯器主要做語法檢查以及分析源代碼工作。
2>.託管模塊主要是由中間語言(也稱託管代碼,是一種面向對象的機器語言,最終被CLR加載執行)以及元數據(描述託管模塊中定義了什麼以及引用了什麼)組成。
3.使用AL.exe(程序集鏈接器)將託管模塊和資源文件合併到一個程序集中。
4.執行程序集代碼。流程如下:
1>.檢查EXE文件頭決定是創建32還是64位進程並在進程地址空間加載MSCorEE.dll。
2>.初始化CLR並加載EXE程序集。
3>.將程序集中引用的類型以及該類型定義的所有函數存儲在一個Type表中進行管理。
4>.調用主入口函數Main。當首次調用某類型中的某函數時就會調用JITCompiler函數編譯成機器碼並執行,往後再次調用該函數時就直接調用編譯後的機器碼進行執行。其中JITCompiler函數執行過程如下所示:
1>>.在負責實現類型的程序集的元數據中查找被調用的方法。
2>>.從元數據中獲取該方法的IL。
3>>.分配內存塊。
4>>.將IL代碼編譯成機器碼並存儲在3>>步驟分配的內存塊中。
5>>.在Type表中修改與方法對應的條目,使它指向3>>步驟分配的內存塊,從而第二次調用時可以直接執行機器碼。
6>>.跳轉到3>>步驟中分配的內存塊並執行機器碼。

C#編譯器開關詳解:如下所示:
1./platform開關選項對生成的託管模塊以及運行時的影響如下表所示:

/platform開關 生成的託管模塊 x86 Windows x64 Windows ARM Windows RT
anycpu(默認) PE32 作爲32位應用程序運行 作爲64位應用程序運行 作爲32位應用程序運行
anycpu32bitpreferred PE32 作爲32位應用程序運行 作爲WoW64應用程序運行 作爲32位應用程序運行
x86 PE32 作爲32位應用程序運行 作爲WoW64應用程序運行 不運行
x64 PE32+ 不運行 作爲64位應用程序運行 不運行
ARM PE32 不運行 不運行 作爲32位應用程序運行

2./optimize和/debug開關選項分別對生成的IL代碼質量以及JIT代碼質量的影響如下表所示:

編譯器開關設置 IL代碼質量 JIT代碼質量
/optimize- /debug-(默認) 未優化 有優化
/optimize- /debug(+/full/pdbonly) 未優化 未優化
/optimize+ /debug(-/+/full/pdbonly) 有優化 有優化

3./unsafe開關是C#編譯器用來編譯具有unsafe關鍵字的C#源碼。當CLR的JIT編譯器用來編譯程序集中的unsafe方法時就會檢測程序集是否被授予了System.Security.Permissions.SecurityPermission權限以及System.Security.Permissions.SecurityPermissionFlag的SkipVerification是否設置,如果沒有就會報錯並終止執行。

微軟提供的常用工具:如下所示:
1.CLRVer.exe工具用來來查看.Net Framework的版本信息。
2.AL.exe工具用來將託管模塊和資源文件合併到一個程序集中。
3.DumpBin.exe以及CorFlags.exe工具用來查看託管模塊所嵌入的信息。
4.PEVerify.exe工具用來檢查程序集中所有的方法並報告出含有不安全代碼的方法。
5.NGen.exe工具用來在安裝應用程序時將所有IL代碼預編譯成機器碼並存儲在磁盤上(位於%SystemRoot%/Assembly/NativeImages_v4.0.#####_64目錄下,其中v4.0表示CLR版本號,64表示Windows系統位數)。具有以下特點:
1>.當執行應用程序時CLR會檢測應用程序是否有被預編譯,如果有就直接執行預編譯的機器碼,從而提高應用程序的啓動速度。
2>.當應用程序被加載到多個進程中時,由於預編譯的機器碼只有一份且會鏈接到不同的進程中,從而減小應用程序工作集的大小。
3>.CLR加載NGen.exe生成的機器碼時,會和當前執行環境(CLR版本,CPU類型,Windows系統版本,安全性,引用的程序集版本ID,程序集的模塊ID等)進行比較,如果不匹配的話,就會將程序集中的IL使用JIT進行編譯成機器碼,此時就沒有知識產權保護以及NGen.exe生成的機器碼失去同步。
4>.NGen.exe的編譯策略相比JIT編譯策略來說比較保守,生成的機器碼沒有進行高度優化,所以在執行時性能較差。
6.MPGO.exe工具用來分析程序執行,檢測啓動時需要哪些東西,並把這些信息提供給NGen.exe,從而方便NGen.exe更好的預編譯機器碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章