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