第一章 .NET體系結(jié)構(gòu)
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
.NET體系由公共語言運行庫(CLR)(Common Language Runtime)和.NET Framework類庫所構(gòu)成。CLR是.NET Framework 的核心執(zhí)行環(huán)境,也稱為.NET運行庫。.NET Framework類庫是一個內(nèi)容豐富的類集合,它可以完成以前要通過Windows API來完成的絕大多數(shù)任務(wù)。 一、CLR概述 CLR主要負(fù)責(zé)托管代碼的編譯和運行。在.NET中代碼的編譯分為兩個階段: 1. 把源代碼編譯為Microsoft中間語言(IL)。2. CLR把IL編譯為平臺專用的代碼。 在CLR的控制下運行的代碼常常稱為托管代碼(managed code)。托管代碼的優(yōu)點: 1. 平臺無關(guān)性。源代碼先編譯成中間語言,運行時由CLR將中間語言編譯成平臺專用的代碼,跟Java的字節(jié)代碼一樣,這樣即可實現(xiàn)平臺無關(guān)性。 2. 提高性能。首先,IL比Java的字節(jié)碼作用還要大,因為IL是即時編譯的,而Java的字節(jié)碼常常是解釋性的,在轉(zhuǎn)換為平臺可執(zhí)行代碼的時候可能會導(dǎo)致性能損失。其次,.NET的即時編譯器(JIT)(Just In Time)并非一次把全部代碼編譯完才執(zhí)行,而是只編譯調(diào)用的那部分代碼,并把得到的這部分內(nèi)部可執(zhí)行代碼保存起來,下次需要調(diào)用的時候無須重新編譯。Microsoft認(rèn)為這個過程要比一開始編譯整個應(yīng)用程序代碼的效率高得多,因為任何程序的大部分代碼實際上并不是在每次運行過程中都執(zhí)行。最后,傳統(tǒng)的編譯器會優(yōu)化代碼,但它們的優(yōu)化過程是獨立于代碼所運行的特定處理器的。例如Visual Studio 6優(yōu)化了一臺一般的Pentium機器,它所生成的代碼就不能利用Pentium Ш處理器的硬件特性。而JIT與平臺無關(guān),所以它可以針對不同的機器完成不同的優(yōu)化。 3. 語言的互操作性。互操作性即能將任何一種語言編譯為中間代碼,編譯好的代碼可以與從其它語言編譯過來的代碼進行交互操作。在.NET中可以交互操作的語言有C#、VB.NET、Visual C++.NET、Visual J#、腳本語言、COM和COM+。 二、中間語言 中間語言(IL)在.NET Framework中有非常重要的作用,所有面向.NET的語言都要先編譯成IL,那么它們在邏輯上都需要支持IL的主要特征。IL的主要特征: 1. 面向?qū)ο蠛褪褂媒涌?/span> 2. 值類型和引用類型之間的巨大差別 3. 強數(shù)據(jù)類型 4. 使用異常來處理錯誤 5. 使用特性(attribute) 下面詳細(xì)討論一下這些特性。 1. 面向?qū)ο蠛徒涌诘闹С?/span> Microsoft為IL選擇的特定道路是傳統(tǒng)的面向?qū)ο蟮木幊蹋瑤в蓄惖膯我焕^承性。此外IL還引進了接口的概念。.NET接口與COM接口不同,它們不需要支持任何COM基礎(chǔ)結(jié)構(gòu),例如,它們不是派生自IUnknown,也沒有GUID。但是它們與COM接口共享下述理念:提供一個契約,實現(xiàn)給定接口的類必須提供該接口指定的方法和屬性的實現(xiàn)方式。 2. 值類型與引用類型 與其它編程語言一樣,IL提供了許多預(yù)定義的基本數(shù)據(jù)類型,IL的一個特征就是值類型和引用類型有明顯的區(qū)別。對于值類型,變量直接保存其數(shù)據(jù),在堆棧上面分配存儲空間;而對于引用類型,變量保存數(shù)據(jù)的地址,引用類型的數(shù)據(jù)在堆上非配存儲空間。 3. 強數(shù)據(jù)類型 IL的一個重要方面是它基于強數(shù)據(jù)類型,即所有的變量都清晰地標(biāo)記為屬于某個特定數(shù)據(jù)類型,IL一般不允許對模糊的數(shù)據(jù)類型執(zhí)行任何操作。 盡管強迫實現(xiàn)類型的安全性最初會降低性能,但在許多情況下下,我們從.NET提供的、依賴于類型安全的服務(wù)中獲得的好處更多。這些服務(wù)包括: (1) 語言的互操作性 (2) 垃圾收集 (3) 安全性 (4) 應(yīng)用程序域 下面我們分別闡述一下: 3.1 語言互操作性中強數(shù)據(jù)類型的重要性 如果類派生其它類,或包含其它類的實例,它就需要知道其它類使用的所有數(shù)據(jù)類型,這就是強數(shù)據(jù)類型非常重要的原因。假定VB.NET類中的一個方法被定義為返回一個整型,但C#中沒有該名稱的數(shù)據(jù)類型,如果要實現(xiàn)語言的互操作性,那么編譯器就需要知道如何把VB.NET的整型類型映射為C#定義的某種已知類型,這樣就可以在C#代碼中使用返回的類型。 這個問題在.NET中是通過通用類型系統(tǒng)(CTS)(Common Type System)和公共語言規(guī)范(CLS)(Common Language Specification)來解決的。 首先CTS定義了可以在中間語言中使用的預(yù)定義數(shù)據(jù)類型,所有用于.NET的語言都可以生成最終基于這些類型的編譯代碼。例如,VB.NET的整型實際上是一個32位的有符號整數(shù),它映射為IL的類型Int32,C#中的int也映射為IL的類型Int32,這樣C#代碼和VB.NET中的整型數(shù)據(jù)就可以通過IL類型Int32建立相應(yīng)的關(guān)系,從而實現(xiàn)互操作。 CTS除了定義了基本數(shù)據(jù)類型以外,還定義了一個內(nèi)容豐富的類型層次結(jié)構(gòu)。通用類型系統(tǒng)的層次結(jié)構(gòu)反映了IL的單一繼承的面向?qū)ο蟮姆椒ǎ缦聢D所示。 其次CLS和CTS一起確保語言的互操作性。CLS是一個最低標(biāo)準(zhǔn)集,所有面向.NET的編譯器都必須支持它。 3.2 垃圾收集 垃圾收集器用來在.NET中進行內(nèi)存管理,特別是它可以恢復(fù)正在運行中的應(yīng)用程序需要的內(nèi)存。到目前為止,Windows平臺已經(jīng)使用了兩種技術(shù)來釋放進程向系統(tǒng)動態(tài)請求的內(nèi)存:(1)完全手工方式使應(yīng)用程序代碼完成這些工作。(2)讓對象維護引用計數(shù)。 第一種方式是低級、高性能的語言使用技術(shù),例如C++。這種技術(shù)很有效,能即時釋放資源,但是最大的缺點是容易出錯,遺忘釋放內(nèi)存,導(dǎo)致內(nèi)存泄漏。盡管現(xiàn)代開發(fā)環(huán)境提供了幫助檢測內(nèi)存泄漏的工具,但它們很難跟蹤錯誤。 第二種方式是COM對象采用的一種技術(shù),其方法是每個COM組件都保留一個計數(shù),記錄客戶機目前對它的引用數(shù)。當(dāng)這個計數(shù)下降到0時,組件就會刪除自己,并釋放相應(yīng)的內(nèi)存和資源。但它仍然需要客戶機通知組件它們已經(jīng)完成了內(nèi)存的使用,只要有一個客戶機沒有這么做,對象就仍駐留在內(nèi)存中。在某些方面,這個比C++內(nèi)存泄漏更為嚴(yán)重,因為COM對象可能存在于它自己的進程中,從來不會被系統(tǒng)刪除。 .NET采用的方法是垃圾收集器,這是一個程序,其目的是清理內(nèi)存,方法是所有動態(tài)請求的內(nèi)存都分配到堆上,當(dāng).NET檢測到給定進程的托管堆已滿,需要清理時,就調(diào)用垃圾收集器。垃圾收集器處理目前代碼中的所有變量,檢查對存儲在托管堆上的對象的引用,確定哪些對象有引用,哪些沒有引用,沒有引用的對象就不能再從代碼中訪問,即可以被刪除。Java就使用與此類似的垃圾收集器系統(tǒng)。 3.3 安全性 3.4 應(yīng)用程序域 應(yīng)用程序域是.NET中的一個重要技術(shù)改進,它用于減少運行應(yīng)用程序的系統(tǒng)開銷,這些應(yīng)用程序需要與其它程序分離開來,但同時還需要彼此通信。典型的例子是web服務(wù)器應(yīng)用程序,它需要同時響應(yīng)許多瀏覽器請求,因此,要有許多組件實例同時響應(yīng)這些同時運行的請求。 到現(xiàn)在為止,孤立代碼的唯一方式是通過進程來實現(xiàn)的。在運行一個新的應(yīng)用程序時,它會在一個進程環(huán)境內(nèi)運行。Windows通過地址空間把進程分隔開來。這樣,每個進程有4GB的虛擬內(nèi)存來存儲其數(shù)據(jù)和可執(zhí)行代碼(4GB對應(yīng)32位系統(tǒng)),虛擬內(nèi)存映射到物理內(nèi)存,物理內(nèi)存不能有重疊,這種情況如下圖所示: 進程對確保安全有很大的幫助,而它們卻存在性能的缺點。往往多個進程需要一起工作,且需要相互通信。例如進程調(diào)用一個COM組件,而該COM組件是可執(zhí)行的,需要在它自己的進程上運行。因為進程不能共享任何內(nèi)存,所以必須使用一個復(fù)雜的編組過程在進程之間復(fù)制數(shù)據(jù)。這對性能有非常大的影響。避免性能影響的唯一方法是基于DLL的組件,讓所有的組件在同一地址空間運行——其相關(guān)的風(fēng)險是執(zhí)行出錯的組件會影響其它組件。
中間語言具有強大的類型安全功能,在大多數(shù)情況下,除非代碼 明確使用不安全的特性,例如指針,否則它使用的數(shù)據(jù)類型可以確保內(nèi)存不會被錯誤地訪問。 三、程序集 程序集(assembly)是包含編譯好的、面向.NET Framework的代碼的邏輯單元。它是完全自我描述性的,是一個邏輯單元,可以存儲在多個文件中。如果一個程序集存儲在多個文件中,其中就會有一個包含入口點的主文件,該文件描述了程序集中的其它文件。 可執(zhí)行代碼和庫代碼的程序集結(jié)構(gòu)相同,唯一區(qū)別是可執(zhí)行的程序集包含一個主程序入口點,而庫程序集不包含。 程序集包含程序的元數(shù)據(jù),元數(shù)據(jù)描述了對應(yīng)代碼中定義的類型和方法以及描述程序集本身,這樣其它程序在調(diào)用該程序集的時候,不需要指定注冊表或其它數(shù)據(jù)源。通過元數(shù)據(jù)還可以將程序集放在不同的位置上而不影響數(shù)據(jù)的同步問題。 程序集有兩種類型:共享程序集和私有程序集。私有程序集一般附帶在某些軟件上,且只能用于該軟件中。系統(tǒng)可以保證私有程序集不被其它軟件使用,因為應(yīng)用程序只能加載位于主執(zhí)行文件所在文件夾或其子文件夾中的程序集。共享程序集是其它應(yīng)用程序可以使用的公共庫。 四、.NET Framework類 .NET Framework類是一個內(nèi)容豐富的托管代碼類集合,它可以完成以前要通過Windows API來完成的絕大多數(shù)任務(wù)。這些類派生于與中間語言相同的對象模型,也基于單一繼承性。可以實例化.NET Framework類,也可以從它們派生自己的類。.NET Framework類直觀易用,它結(jié)合了Visual Basic和Java庫的易用性和Windows API函數(shù)的豐富功能。.NET Framework類包括: 1. IL提供的核心功能,例如,通用類型系統(tǒng)中的基本數(shù)據(jù)類型 2. Windows GUI支持和控件 3. Web窗體 4. 數(shù)據(jù)訪問 5. 目錄訪問 6. 文件系統(tǒng)和注冊表訪問 7. 網(wǎng)絡(luò)和web瀏覽 8. .NET特性和反射 9. 訪問Windows操作系統(tǒng)的各個方面(如環(huán)境變量等) 10.COM互操作性 該文章在 2017/2/7 18:54:32 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |