快速理解.NET Framework[翻譯]
2024-07-10 12:59:26
供稿:網(wǎng)友
 
快速理解.net framework
引言
本文著眼于微軟.net框架。這是較新發(fā)布的軟件開(kāi)發(fā)環(huán)境,它幫助開(kāi)發(fā)者快速開(kāi)發(fā)應(yīng)用程序并且提供各種不同語(yǔ)言像visual basic .net, c#, asp .net, 和jscript .net等開(kāi)發(fā)最合適的,高效的,可擴(kuò)展的,面向性能的應(yīng)用程序 。
 
.net框架概述
.net框架是一種新的計(jì)算平臺(tái),它在internet高度分布的環(huán)境中簡(jiǎn)化應(yīng)用程序開(kāi)發(fā)
 
服務(wù)
net框架提供以下服務(wù):
開(kāi)發(fā)軟件應(yīng)用工具 
執(zhí)行軟件應(yīng)用的運(yùn)行時(shí)環(huán)境 
服務(wù)器基礎(chǔ)設(shè)施 
幫助開(kāi)發(fā)者減少編碼提高工作效率的增值只能軟件
.net框架將使開(kāi)發(fā)者為不同設(shè)備和不同平臺(tái)開(kāi)發(fā)應(yīng)用程序,如:windows應(yīng)用程序、web應(yīng)用程序、windows服務(wù)和web服務(wù)。
 
目標(biāo)
設(shè)計(jì).net框架是為了實(shí)現(xiàn)下列目標(biāo):
一個(gè)一致的面向?qū)ο缶幊汰h(huán)境,目標(biāo)代碼能本地化存儲(chǔ)和執(zhí)行,本地化執(zhí)行而不是分布式internet,或者遠(yuǎn)程執(zhí)行。 
一個(gè)減少軟件部署和版本沖突的代碼編輯環(huán)境。 
一個(gè)確保安全的代碼執(zhí)行的代碼編輯環(huán)境,包括來(lái)自未知的或是不能完全信任的社團(tuán)的代碼。 
一個(gè)能消除腳本的或解釋性的環(huán)境引起的性能問(wèn)題的代碼編輯環(huán)境。 
開(kāi)發(fā)者在面對(duì)大量不同應(yīng)用系統(tǒng)類(lèi)型時(shí)有一致的開(kāi)發(fā)體驗(yàn),如基于windows的應(yīng)用程序和基于web的應(yīng)用程序。 
構(gòu)造所有工業(yè)標(biāo)準(zhǔn)信息來(lái)確保基于.net框架的代碼能夠集成任何其他代碼。
 
理解.net框架體系結(jié)構(gòu)
 .net框架有兩個(gè)組件:.net框架類(lèi)庫(kù)和公共語(yǔ)言運(yùn)行時(shí)。
 .net框架類(lèi)庫(kù)使類(lèi)型(cts)變的簡(jiǎn)單,它對(duì)于.net語(yǔ)言來(lái)說(shuō)是公共的。
 公共語(yǔ)言運(yùn)行時(shí)組成部分有由:(類(lèi)加載器)加載程序的il代碼并將起編譯成本地代碼到運(yùn)行時(shí),執(zhí)行和管理代碼來(lái)加強(qiáng)安全和類(lèi)型安全,并且提供線程支持。
 
.net框架體系結(jié)構(gòu)最頂部是像vb .net c#, vj#, vc++ .net之類(lèi)的語(yǔ)言;開(kāi)發(fā)者能開(kāi)發(fā)(使用上面的任何語(yǔ)言)像windows窗體,web窗體,windows服務(wù)和xml web服務(wù)。
理解.net框架的角色
 .net框架有兩個(gè)組要的組件:公共語(yǔ)言運(yùn)行時(shí)(clr)和.net框架類(lèi)庫(kù)。公共語(yǔ)言運(yùn)行時(shí)是.net框架的基礎(chǔ)。clr 在運(yùn)行時(shí)管理代碼,提供像內(nèi)存管理,線程管理和remoting之類(lèi)的核心服務(wù),同時(shí)也加強(qiáng)嚴(yán)格的類(lèi)型安全和促進(jìn)代碼正確來(lái)確保程序的安全性和健壯性(魯棒性)。代碼管理的概念是clr的基本原則。針對(duì)clr的代碼被認(rèn)為是可管理的代碼,而不是針對(duì)clr的代碼則被認(rèn)為是不可管理的代碼。
 類(lèi)庫(kù)是.net框架的一個(gè)完整的組件, 包括可重用類(lèi)的面向?qū)ο蠹希刮覀兡苡脕?lái)開(kāi)發(fā)應(yīng)用程序包括傳統(tǒng)的命令行或是任何像windows窗體,asp. net web窗體和新近發(fā)明的xml web 服務(wù)的windows服務(wù)這樣的圖形用戶(hù)接口(gui)。
 歐洲計(jì)算機(jī)制造商協(xié)會(huì)(ecma)標(biāo)準(zhǔn)定義了通用語(yǔ)言規(guī)范(cls);這加強(qiáng)了軟件開(kāi)發(fā)語(yǔ)言能夠進(jìn)行互操作。按照cls編寫(xiě)的代碼應(yīng)該能和另一個(gè)符合cls語(yǔ)言的代碼一起編譯。因?yàn)橛煞蟘ls語(yǔ)言支持的代碼將會(huì)被編譯成中間語(yǔ)言(il)代碼。clr引擎執(zhí)行il代碼。這保證了符合cls語(yǔ)言的互用性。微軟.net框架支持的語(yǔ)言有microsoft visual basic .net, microsoft visual c#, microsoft visual c++ .net, and microsoft visual j# .net.
語(yǔ)言編譯器生成中間語(yǔ)言代碼,叫做微軟中間語(yǔ)言(msil),它使不同可互操作的.net語(yǔ)言編寫(xiě)程序。
 ecma標(biāo)準(zhǔn),公共語(yǔ)言架構(gòu)(cli),定義了il代碼需要執(zhí)行的基礎(chǔ)架構(gòu)的規(guī)范。cli提供一個(gè)公共類(lèi)型系統(tǒng)(cts)和像類(lèi)型安全,可管理的代碼執(zhí)行和side by side執(zhí)行的服務(wù)。
圖1.微軟.net框架的ecma標(biāo)準(zhǔn)
.net框架提供基礎(chǔ)架構(gòu)和服務(wù)。cli規(guī)范.它們包括: 
 公共語(yǔ)言運(yùn)行時(shí):
 clr包括cli
 clr也提供.net應(yīng)用程序的執(zhí)行環(huán)境
 公共類(lèi)型系統(tǒng):
 提供數(shù)據(jù)類(lèi)型,值,對(duì)象類(lèi)型。這使得開(kāi)發(fā)人員能用不同的語(yǔ)言開(kāi)發(fā)應(yīng)用程序。.net語(yǔ)言共享cts意味著所有在應(yīng)用程序中的類(lèi)型在cli類(lèi)型定義中是一樣的。
 類(lèi)型安全:
 .net框架在值和對(duì)象上執(zhí)行操作,因?yàn)?net框架需要知道每個(gè)值和對(duì)象的類(lèi)型并且引用值和對(duì)象類(lèi)型。
 可管理的代碼執(zhí)行
 .net框架管理執(zhí)行.net應(yīng)用程序時(shí)對(duì)象的狀態(tài)。
 .net框架自動(dòng)分配內(nèi)存并提供來(lái)機(jī)收集機(jī)制來(lái)重新分配內(nèi)存
 side-by-side執(zhí)行
 .net框架通過(guò)使用不同版本的裝配器允許同一應(yīng)用程序的不同版本運(yùn)行在同一機(jī)器上。裝配器由il代碼和元數(shù)據(jù)組成。元數(shù)據(jù)決定應(yīng)用程序的依賴(lài)關(guān)系。通過(guò)這個(gè),.net框架運(yùn)行時(shí)能執(zhí)行多種版本裝配器并且解決遺留的開(kāi)發(fā)環(huán)境的主要問(wèn)題。那就是dll hell?
.net裝配器
圖2 side-by-side執(zhí)行
理解.net框架clr
 公共語(yǔ)言運(yùn)行時(shí):
運(yùn)行時(shí)環(huán)境
clr把應(yīng)用程序編譯成有運(yùn)行時(shí),把il代碼編譯成本地代碼,執(zhí)行代碼
運(yùn)行時(shí)服務(wù)
內(nèi)存管理 
類(lèi)型安全 
增強(qiáng)安全 
異常管理 
線程支持 
調(diào)試支持
理解.net框架clr的體系結(jié)構(gòu)
類(lèi)加載器,將類(lèi)加載到clr。 
msil到本地代碼的編譯,將把msil轉(zhuǎn)變成本地代碼。 
代碼管理器,它在代碼執(zhí)行期間進(jìn)行管理。 
內(nèi)存分配和垃圾收集,表現(xiàn)為自動(dòng)內(nèi)存管理。 
安全的引擎,使用微軟提供的工具和在控制面板對(duì).net框架配置加強(qiáng)安全限制包括代碼級(jí)安全、文件及機(jī)器級(jí)安全。 
類(lèi)型檢查器,增強(qiáng)強(qiáng)類(lèi)型檢查。 
線程支持,提供對(duì)應(yīng)用程序的多線程支持。 
異常管理器,提供對(duì)運(yùn)行時(shí)異常處理的機(jī)制。 
調(diào)試引擎,允許開(kāi)發(fā)者調(diào)試應(yīng)用程序的不同類(lèi)型。 
com配置,允許.net應(yīng)用程序與com應(yīng)用程序交換數(shù)據(jù)。 
基類(lèi)庫(kù)支持,提供應(yīng)用程序運(yùn)行時(shí)所需的類(lèi)。
公共語(yǔ)言運(yùn)行時(shí)的特征
 clr有以下特征:
管理內(nèi)存: 
內(nèi)存分配 
內(nèi)存的重分配(垃圾收集)
線程執(zhí)行支持 
代碼執(zhí)行 
代碼安全檢查 
編譯 
msil到本地代碼
基于信任的代碼安全(對(duì)執(zhí)行代碼的授權(quán)。代碼級(jí),文件級(jí),機(jī)器級(jí))這些特征對(duì)運(yùn)行在公共語(yǔ)言運(yùn)行時(shí)的可管理代碼來(lái)說(shuō)是固有的。
理解clr
 為了執(zhí)行程序并且獲得可管理執(zhí)行環(huán)境的所以好處,我們用cls支持的.net框架語(yǔ)言編寫(xiě)代碼。語(yǔ)言編譯器將源代碼編譯成由cpu相關(guān)的代碼和平臺(tái)相關(guān)的指令組成的msil代碼。msil有下列組成:
能夠執(zhí)行算術(shù)和邏輯運(yùn)算的指令。 
直接訪問(wèn)內(nèi)存。 
控制執(zhí)行流 
處理異常
 msil代碼能夠在執(zhí)行前被編譯成特定cpu指令,clr所需要代碼的信息只有元數(shù)據(jù)。元數(shù)據(jù)描述代碼并且定義代碼類(lèi)型包括引用代碼在運(yùn)行期用到的其他類(lèi)型。
 一個(gè)裝配器由精簡(jiǎn)的可執(zhí)行文件組成。當(dāng)執(zhí)行pe文件的時(shí)候類(lèi)加載器價(jià)載msil代碼而元數(shù)據(jù)把精簡(jiǎn)的可執(zhí)行文件編成運(yùn)行時(shí)內(nèi)存。
 pe文件執(zhí)行之前它將代碼傳遞到本地代碼編譯器進(jìn)行編譯,il到本地代碼的編譯是有jit編譯器完成的。因?yàn)椴煌腸pu架構(gòu)和編譯器 il代碼到本地指令。
clr的特點(diǎn)
被管理的多線程支持和線程監(jiān)控。應(yīng)用程序域包括一個(gè)或多個(gè)執(zhí)行線程。 
管理不安全代碼的互用性,和com配置。 
結(jié)構(gòu)化的異常處理機(jī)制 
基礎(chǔ)架構(gòu)和被管理執(zhí)行進(jìn)程,內(nèi)存管理和垃圾收集
clr的結(jié)構(gòu)
基類(lèi)庫(kù)支持支持所有使用.net語(yǔ)言來(lái)支持基本功能性的基類(lèi)。 
com配置支持com對(duì)象間數(shù)據(jù)的重組。 
異常管理支持使用try catch finally語(yǔ)句塊在運(yùn)行時(shí)處理錯(cuò)誤。 
安全引擎在運(yùn)行時(shí)加強(qiáng)安全規(guī)則。 
類(lèi)型檢查器在運(yùn)行時(shí)作類(lèi)型安全檢查。 
調(diào)試引擎支持運(yùn)行時(shí)調(diào)試。 
代碼管理器管理運(yùn)行時(shí)被管理代碼 
il到本地代碼編譯器將msil代碼編譯成機(jī)器相關(guān)的本地代碼 
垃圾收集器支持內(nèi)存管理并支持清理運(yùn)行時(shí)廢棄的內(nèi)存。 
類(lèi)加載器在運(yùn)行時(shí)加載類(lèi)。
理解jit編譯器
 jit編譯器作為clr的一個(gè)完整的部分將msil代碼編譯成本地代碼并且實(shí)時(shí)執(zhí)行整批代碼。代碼將會(huì)被緩存而下次就會(huì)從緩存中讀取代碼再次編譯執(zhí)行(翻譯不出來(lái))
jit執(zhí)行進(jìn)程
 clr類(lèi)加載器加載msil代碼并且將元數(shù)據(jù)加載到內(nèi)存;代碼管理器調(diào)用winmain或dllmain方法。jit編譯器在其入口方法執(zhí)行之前編譯這個(gè)方法。代碼管理器將對(duì)象放置在內(nèi)存中并控制代碼的執(zhí)行。垃圾收集器實(shí)現(xiàn)對(duì)管理堆的周期性檢查識(shí)別應(yīng)用程序的無(wú)效對(duì)象。
 程序執(zhí)行時(shí)類(lèi)型檢查器確保所有對(duì)象和值以及對(duì)象和值的引用有其合法的類(lèi)型。類(lèi)型檢查器也保證代碼的唯一合法操作,否則就拋出異常。代碼在運(yùn)行時(shí)由clr控制。clr在以下行為上增強(qiáng)安全性:
像硬盤(pán)一樣控制和訪問(wèn)系統(tǒng)資源 
控制和訪問(wèn)網(wǎng)絡(luò)連接 
控制和訪問(wèn)其他硬件資源
被管理代碼執(zhí)行
 被管理代碼執(zhí)行被認(rèn)為是由clr執(zhí)行的進(jìn)程,具體有以下幾個(gè)方面:
clr加載msil和應(yīng)用元數(shù)據(jù) 
clr執(zhí)行本地代碼, 
clr提供自動(dòng)內(nèi)存管理 
被管理的執(zhí)行也實(shí)現(xiàn)jit編輯 
封裝類(lèi)型安全, 
增強(qiáng)安全性 
處理異常
被管理的執(zhí)行進(jìn)程
被管理代碼是自解釋性的代碼,它在.net框架中給clr多運(yùn)行時(shí)服務(wù)的信息。 
這些信息在pe文件里以元數(shù)據(jù)的形式被存儲(chǔ)在msil代碼中。元數(shù)據(jù)信息會(huì)描述代碼包含的類(lèi)型。 
被管理數(shù)據(jù)是由垃圾收集器自動(dòng)被分配和釋放的。被管理代碼能被被管理數(shù)據(jù)理解而非管理數(shù)據(jù)能被被管理理解。(翻的不正確)
內(nèi)存管理
自動(dòng)內(nèi)存管理意味著當(dāng)對(duì)象創(chuàng)建時(shí)不需要編寫(xiě)代碼分配內(nèi)存或是當(dāng)應(yīng)用程序不需要對(duì)象時(shí)釋放內(nèi)存。 
自動(dòng)內(nèi)存管理的進(jìn)程包括下列任務(wù):
?分配內(nèi)存
 
當(dāng)一個(gè)進(jìn)程被初始化時(shí),運(yùn)行時(shí)保留了一個(gè)連續(xù)的地址空間而不為它分配任何存儲(chǔ)空間。 
這個(gè)保留的地址空間被叫做托管堆。托管堆在下一個(gè)對(duì)象被放置的地方保留了一個(gè)指針。 
當(dāng)一個(gè)應(yīng)用程序使用new操作符創(chuàng)建一個(gè)對(duì)象時(shí),new操作符檢查堆內(nèi)對(duì)象所需的內(nèi)存是否可用。 
當(dāng)下一個(gè)對(duì)象創(chuàng)建的時(shí)候,垃圾收集器在托管堆分配內(nèi)存給對(duì)象。 
在托管堆分配內(nèi)存給對(duì)象的時(shí)間比分配非托管堆內(nèi)存耗時(shí)要少。 
在非托管堆中,指向內(nèi)存的指針在鏈表數(shù)據(jù)結(jié)構(gòu)中維護(hù)。因此,分配內(nèi)存需要通過(guò)操縱鏈表,尋找能夠容納它的較大的內(nèi)存塊。(此處原文不全) 
與訪問(wèn)非托管內(nèi)存相比你能更快地訪問(wèn)托管內(nèi)存的對(duì)象,因?yàn)樵谕泄軆?nèi)存分配時(shí),對(duì)象總是在托管的地址空間中分配。
?釋放內(nèi)存
垃圾收集器周期性地應(yīng)用程序不再需要的對(duì)象中釋放內(nèi)存。 
每個(gè)應(yīng)用程序有一組根指針。根指針指向在托管堆存儲(chǔ)位置。每個(gè)根指針或者引用托管堆中的一個(gè)對(duì)象或是被置成空。 
一個(gè)應(yīng)用程序的根指針由線程棧上的全局靜態(tài)指針,局部變量和引用對(duì)象參數(shù)組成。 
jit編譯器和運(yùn)行時(shí)維護(hù)應(yīng)用程序根指針的列表。垃圾收集器使用這個(gè)列表創(chuàng)建從根指針列表中獲得的在托管堆中的對(duì)象圖表。 
當(dāng)垃圾收集器開(kāi)始運(yùn)行,它把在托管堆中的所有對(duì)象都看作垃圾。 
垃圾收集器通過(guò)應(yīng)用程序的根指針列表操作,這個(gè)列表定義了在應(yīng)用程序根指針列表中有相應(yīng)的引用的對(duì)象并對(duì)可獲得的對(duì)象標(biāo)記。 
垃圾收集器也把這樣的對(duì)象作為可獲得對(duì)象。(不知道是什么意思) 
垃圾收集器認(rèn)為所有托管堆中不可獲得的對(duì)象是垃圾。 
垃圾收集器通使用收集進(jìn)程釋放垃圾對(duì)象空間。 
垃圾收集器使用內(nèi)存復(fù)制功能來(lái)壓縮托管堆中的對(duì)象。 
垃圾收集器更新應(yīng)用程序根指針列表中的指針,使得指向較早的應(yīng)用程序根指針正確指向?qū)ο蟆?
垃圾收集器使用高度優(yōu)化的機(jī)制完成垃圾收集。它把托管堆中的對(duì)象分為三級(jí):0、1、和2。第0級(jí)包括最近被創(chuàng)建的對(duì)象。 
垃圾收集器開(kāi)始在第0級(jí)收集不可獲得的對(duì)象。接著,垃圾收集器緊縮內(nèi)存并將可獲得對(duì)象提升為第1級(jí)。 
幸免于收集進(jìn)程收集的對(duì)象被提升為更高的級(jí)別。 
垃圾收集器在第1級(jí)和第2級(jí)搜索不可獲得的對(duì)象,僅當(dāng)通過(guò)第0級(jí)對(duì)象的收集進(jìn)程釋放的內(nèi)存不足以創(chuàng)建一個(gè)新的對(duì)象時(shí)。 
垃圾收集器為所有應(yīng)用程序創(chuàng)建的托管對(duì)象管理內(nèi)存。 
垃圾收集器能通過(guò)在對(duì)象等dispose方法中提供清除代碼來(lái)顯式釋放這些系統(tǒng)資源。 
我們?cè)趯?duì)象完成工作后需要顯式調(diào)用dispose方法。
?實(shí)現(xiàn)完成器
完成器進(jìn)程允許一個(gè)對(duì)象在垃圾收集器啟動(dòng)之前完成清理工作。 
finalize方法確保了即使客戶(hù)沒(méi)有顯式調(diào)用dispose方法,所使用的資源在對(duì)象被垃圾收集時(shí)也會(huì)從內(nèi)存被釋放。 
在垃圾收器集進(jìn)行垃圾收集時(shí)識(shí)別對(duì)象是垃圾后,它在釋放內(nèi)存前調(diào)用對(duì)象的finalize方法。 
完成器是包含在對(duì)象收集之前被執(zhí)行的清理代碼的方法。執(zhí)行清理代碼的進(jìn)程被叫做終結(jié)。dispose和finalize方法被叫做完成器。 
對(duì)象的dispose方法會(huì)釋放所有資源,包括它的父對(duì)象擁有的資源通過(guò)調(diào)用父對(duì)象的dispose方法。 
我們有兩個(gè)方法執(zhí)行dispose方法: 
類(lèi)用戶(hù)能夠調(diào)將被銷(xiāo)毀對(duì)象的dispose方法,或者 
finalize方法能在終結(jié)過(guò)程中調(diào)用dispose方法。
未完待序……