国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

The CLR’S Execution Model

2019-11-17 02:21:31
字體:
來源:轉載
供稿:網友

The CLR’S Execution Model

微軟.NET Framework介紹了很多概念、技術和術語。在這一章我的目標是給你一個概述,.NET Framework是怎么設計的,介紹一些框架包含的技術,和很多定義的術語,當你開始使用.NET Framework的時候將會看到這些。我也將通過帶你建立你自己的源碼應用程序或者一個可再使用組件(文件集)集合包含(類,枚舉,等等)向你解釋一個應用程序是將怎么執行。

 

Compiling Source Code into Managed Modules(編譯源碼到托管模塊)

那么你已經決定使用.NET Framework作為你的開發平臺了。你的第一步是決定你想要開發的是哪一種類型的應用程序或者組件。讓我們來假定你已經完成了這個小細節;每一件事都已經設計好了,規格說明書都已近寫好了,并且你已經準備開發了。

現在你必須決定要使用哪一種開發語言。一般而言,這個任務有點難度,因為不同的語言擁有不同的能力。比如,非托管的C/C++,你能控制底層的系統。你能通過你想要的方式精確的管理內存,當你想創建線程的時候很容易,等等。微軟Visual Basic 6.0,在另一方面,允許你快速的創建UI應用程序和可以讓你容易的控制COM組件和數據庫

公共語言運行庫(CLR)正如它的名字一樣:runtime可用于不同的和各種各樣的編程語言。CLR的核心特征(比如內存管理,程序集加載,安全,異常處理,和線程同步)可適用于任何和所有編程語言只要編譯目標期間是CLR。比如,runtime使用異常報告錯誤,所以所有編譯目標是runtime的編程語言獲得錯誤報告都是通過異常得到的。另一個例子是runtime允許你創建線程,所以所有編譯目標是runtime的編程語言都可以創建線程。

事實上,在runtime庫中,CLR不知道開發者使用哪一種開發語言寫的源碼。這意味著你選擇的開發語言應該是最容易表達你的意圖的。你可以用任何你想用的開發語言只要你使用的編譯器能把你的代碼編程成CLR。

所以,假如我說的真的,使用某個開發語言而不使用另一個開發語言有什么好處?好吧,我認為編譯器作為語法檢查者和"代碼糾錯"分析者。它們檢查你的源代碼,確保你寫的源碼有一些道理,然后輸出描述你意圖的代碼。不同的編程語言允許你在開發時使用不同的語法。不要低估選擇開發語言的價值。比如,對于數學或者財政應用程序,使用APL語法表達你的開發意圖可以節省很多天開發時間相較于使用Perl語法表達相同的開發意圖。

微軟已經創建了幾門語言編譯器編譯成runtime:C++、CLI,C#(發音"C sharp"),Visual Basic,F#(發音"F sharp")Iron Python,Iron Ruby,和IL匯編。除微軟外,另外幾家公司、大學都創建了編譯器并且產生的代碼目標是CLR。我知道的編譯器可編譯的語言有Ada,APL,Caml,COBOL,Eiffel,Forth,Fortran,Haskell,Lexico,LISP,LOGO,Lua,Mercury,ML,Mondrian,Oberon,Pascal,Perl,phpPRolog,RPG,Scheme,SmallTalk,和 Tcl/Tk。

下圖指出了程序編譯源碼文件。如圖所示,你可以使用任何支持CLR的編程語言創建源碼文件集。然后你可以使用相應的編譯器檢查語法和分析源碼。不管你使用哪一個編譯器,結果都是托管組件。一個托管模塊是一個標準的32位Windows PE32文件或者標準64位Windows PE32+文件只能在CLR執行。順便說一句,在Windows中托管程序集會得到DEP和ASLR的好處,這兩個特征提高了你整個系統的安全性。

11_thumb7_thumb1

圖表描述了托管模塊的組件。

 

托管組件組成部分

組件名稱

描述

PE32或者PE32+ header

標準Windows PE文件頭,它和COFF(Common Object File Format)的頭文件很像。假如頭文件使用PE32轉換,那么所轉換文件可在32位或者64位的Windows系統上運行。假如頭文件使用PE32+轉換,那么文件只能在64位版本的Windows系統上運行。頭文件也規定了文件的格式:GUI,CUI,或者DLL,并且包含一個文件何時創建的時間戳。對于只包含IL代碼的模塊,大部分在PE32(+)頭文件中的信息都會被忽略。對于包含本地CPU代碼的模塊,這個頭文件包含了本地CPU代碼信息。

CLR header

包含標記當前模塊為托管模塊的信息(通過CLR和工具解釋得來的信息)。頭文件包含所需的CLR版本,一些標記,托管模塊方法(Main method)入口點的MethodDef元數據令牌。模塊元數據的位置和大小,資源,強命名,一些標記,和其他少量有趣的東西。

元數據

每個托管模塊都包含元數據表單。所有的表單中有兩個主要的分類:一種是描述你源碼中定義的類型和成員,另一種是描述源碼中的被引用的類型和成員。

IL Coder

編譯器編譯產生的代碼。在運行時,CLR把IL編譯成本地CPU指令。

本地代碼編譯器按照指定的CPU架構生成代碼,比如x86,x64,或者ARM。所有順從CLR編譯器的都會生成IL。(我在后面的章節會深入更多的IL代碼細節。)IL代碼有時會被歸為托管代碼,因為CLR管理它的執行。

除了生成IL,每一個以CLR為編譯目標的編譯器都要求在每個托管模塊中生成所有元數據。簡而言之,元數據是數據表的一個集合,描述了在模塊中定義了什么,比如類型和成員。此外,元數據也有表指出托管模塊的引用,比如導入的類型和導入的成員。元數據是老技術的一個超集,比如COM's Type Libraries和Interface Definition Language(IDL) 文件。重點需要注意的是CLR元數據更完整。并且,不同于Type Libraries和IDL,元數據一直是和包含IL代碼的文件是關聯的。事實上,元數據一直作為代碼嵌入到相同名字的EXE/DLL中,使具有相同名字的EXE/DLL不能分離。因為編譯器生成元數據和代碼的同時把它們綁定到托管模塊,元數據和IL代碼不能分開描述。

下面是元數據的一些用處:

*編譯時元數據移除了本地的C/C++頭文件和庫文件,因為所有類型/成員引用信息已經包含在IL中,IL實現了類型/成員。編譯器可以直接從托管模塊中讀取元數據。

*微軟Visual Studio使用元數據幫助你寫代碼。它的智能提示特性通過轉換元數據告訴你方法需要的屬性,事件,和提供的字段類型,在一個方法中該方法需要什么參數。

*CLR的代碼驗證程序使用元數據確保你的代碼執行時類型安全。

*元數據允許一個對象的字段系列化為內存塊,發送給另一個機器,然后反系列化,在遠程機器上重建對象的狀態。

*元數據允許垃圾回收器跟蹤對象的生命周期。對于任何對象來說,垃圾回收器能決定對象是何種類型,通過元數據,知道哪一個對象所包含的字段被另一個對象引用。

在第二章,"生成,打包,部署,管理程序和類型",我將講更多的元數據細節。

微軟的C#,Visual Basic,F#,和IL Assembler總是生成包含托管代碼(IL)和托管數據(回收數據類型)的模塊。為了執行包含托管代碼或者托管數據的模塊,最終用戶必須在他們的機器安裝了CLR(目前作為.NET Framework的一部分),同樣的,他們也需要安裝Microsoft Foundation Class(MFC)庫或者Visual Basic DLLs才能運行MFC或者Visual Basic 6.0程序。

默認的,微軟的C++編譯器生成包含非托管(本地)代碼和可以操作非托管數據(本地內存)EXE/DLL的模塊在運行時。這些模塊不需要CLR執行。無論如何,通過指定CLR命令行轉換,C++編譯器生成的模塊將包含托管代碼,這樣一來,要執行這些代碼就需要安裝CLR了。微軟所有的編譯器都提到,C++是唯一編譯器可允許程序員寫托管和非托管代碼的編程語言并且放到一個模塊中。C++也是微軟編譯器唯一允許開發者在源碼中定義托管和非托管數據類型的語言。和其他編譯器相比微軟的C++編譯器的靈活性是無以倫比的,因為它允許開發者使用已存在的本地托管C/C++代碼并且開始集成開發者看到適合的托管類型。

 

Combining Managed Modules into Assemblies(組合托管模塊為程序集)

CLR實際上不是依靠模塊工作,而是依賴程序集。程序集是一個抽象概念剛開始很難領會。首先,一個程序集是一個邏輯組對應一個或多個模塊或源文件集。第二,一個程序集是可重用的、安全的、版本化的最小單元。根據你使用的編譯器或工具你可以選擇生成一個文件或一個多文件程序集。在CLR的世界里,一個程序集就是我們叫的組件。

在第二章中,我將十分詳細的重溫程序集,所以我不打算在這花太多時間在程序集上。現在我所要做的是讓你知道一個額外的概念,一種把一組文件當作一個實體的思路。

下圖應該可以幫助解釋程序集是什么。在這張圖中,一些托管模塊是被一個工具加工過的源文件(或數據)文件。這個工具每產生一個單獨的PE32(+)文件就代表著一個經過邏輯分組的文件集。這個PE32(+)文件包含了一塊數據被稱作載貨單。載貨單是元數據表其中一個簡單的集合。這些表描述了文件如何組成程序集合,公開導出類型實現的文件在集合中,并且資源或者數據文件與程序集合都有關聯。

image_thumb1_thumb1

上圖指出了如何把托管模塊組裝到程序集。

默認的,編譯器實際做的工作是把分散的托管模塊轉換成一個程序集合;C#編譯器發出一個托管模塊包含一個載貨單。載貨單現實一個程序集僅僅只由一個文件組成。所以,對于只有一個托管模塊并且沒有資源(或數據)文件的項目來說,程序集就是托管模塊,當你生成程序的時候不需要任何附加的步驟。如果你要把一個文件集合分組生成程序集,那么你不得不知道更多的工具(比如程序集鏈接者,AL.exe)和它們的命令行選項。我將在第二章中解釋這些工具和選項。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 克东县| 海口市| 冕宁县| 凌海市| 开封县| 青田县| 屏东市| 迁安市| 宁都县| 军事| 繁昌县| 酒泉市| 莎车县| 崇义县| 玛曲县| 河源市| 余江县| 安化县| 石渠县| 临高县| 天峻县| 吉首市| 云梦县| 昌平区| 微山县| 青海省| 临邑县| 福州市| 林西县| 南靖县| 泽库县| 图木舒克市| 河间市| 卢龙县| 同仁县| 怀化市| 湖口县| 江陵县| 邢台市| 高雄市| 长丰县|