中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

C#技術(shù)漫談之公共語言運(yùn)行庫(CLR)

  概述

  .NET Framework的核心是其運(yùn)行庫的執(zhí)行環(huán)境,稱為公共語言運(yùn)行庫(CLR)或.NET運(yùn)行庫。通常將在CLR的控制下運(yùn)行的代碼稱為托管代碼(managed code)。

  但是,在CLR執(zhí)行編寫好的源代碼之前,需要編譯它們(在C#中或其它語言中)。在.NET中,編譯分為兩個(gè)階段:

  1、把源代碼編譯為Microsoft中間語言(IL)。

  2、CLR把IL編譯為平臺(tái)專用的代碼。

  這個(gè)兩階段的編譯過程非常重要,因?yàn)镸icrosoft中間語言(托管代碼)是提供.NET的許多優(yōu)點(diǎn)的關(guān)鍵.

  .NET平臺(tái)的整體結(jié)構(gòu):

.<a href=/itjie/NETjishu/ target=_blank class=infotextkey>NET</a>平臺(tái)的整體結(jié)構(gòu)

  .NET Framework是架構(gòu)在Windows平臺(tái)上的一個(gè)虛擬的運(yùn)行平臺(tái),你可以想象將最下層Windows換做其他的操作系統(tǒng),例如說Linux, 一樣可以實(shí)現(xiàn)使用符合CLS(Common Language Specification, 通用語言規(guī)范)的.NET語言(VB.NET、C#、JScript.NET等)來創(chuàng)建ASP.NET或Windows Form(可能會(huì)叫Linux Forms)應(yīng)用程序的功能,這其實(shí)就是Mono計(jì)劃要實(shí)現(xiàn)的功能。所以可以這么認(rèn)為,理論上,C#是一種可以跨平臺(tái)的語言,這很象Java

  C#另一個(gè)比較象Java的地方是,它也是一種(特殊意義上的)語言,同Java一樣,C#編寫的程序代碼也是先通過C#編譯器編譯為一種特殊的字節(jié)代碼 (Microsoft Intermediate Language, MSIL,微軟中間語言),運(yùn)行時(shí)再經(jīng)由特定的編譯器(JIT編譯器)編譯為機(jī)器代碼,以供操作系統(tǒng)執(zhí)行。

  不僅是C#語言,所有.NET語言(將會(huì)包括我們常用的幾十種現(xiàn)代的編碼語言)都可以編寫面向CLR的程序代碼,這種代碼在.NET中被稱為托管代碼(Managed Code),所有的Managed Code都直接運(yùn)行在CLR上,具有與平臺(tái)無關(guān)的特性。

  解釋性的語言很安全,并且可以通過他的運(yùn)行平臺(tái)為其賦予更多的功能,例如自動(dòng)內(nèi)存管理,異常處理等。

  CLR結(jié)構(gòu)圖

CLR結(jié)構(gòu)圖

  C#所具有的許多特點(diǎn)都是由CLR提供的,如類型安全(Type Checker)、垃圾回收(Garbage Collector)、異常處理(Exception Manager)、向下兼容(COM Marshaler)等,具體的說,.NET上的CLR為開發(fā)者提供如下的服務(wù):

  1、平臺(tái)無關(guān):CLR實(shí)際上是提供了一項(xiàng)使用了虛擬機(jī)技術(shù)的產(chǎn)品,它構(gòu)架在操作系統(tǒng)之上,并不要求程序的運(yùn)行平臺(tái)是 Windows系統(tǒng),只要是能夠支持它的運(yùn)行庫的系統(tǒng),都可以在上面運(yùn)行.NET應(yīng)用。所以,一個(gè)完全由托管代碼組成的應(yīng)用程序,只要編譯一次,就可以在任何支持.NET的平臺(tái)上運(yùn)行。

  2、跨語言集成:CLR允許以任何語言進(jìn)行開發(fā),用這些語言開發(fā)的代碼,可以在CLR環(huán)境下緊密無縫的進(jìn)行交叉調(diào)用,例如,可以用VB聲明一個(gè)基類對(duì)象,然后在C#代碼中直接創(chuàng)建次基類的派生類。
  3、自動(dòng)內(nèi)存管理:CLR提供了垃圾收集機(jī)制,可以自動(dòng)管理內(nèi)存。當(dāng)對(duì)象或變量的生命周期結(jié)速后,CLR會(huì)自動(dòng)釋放他們所占用的內(nèi)存.
  4、跨語言應(yīng)用

  當(dāng)編程人員在用自己喜歡的編程語言寫源代碼的時(shí)候, 這個(gè)源代碼在被轉(zhuǎn)化成媒介語言(IL)之前,先被編譯成了一個(gè)獨(dú)立的可執(zhí)行單元(PE)。這樣無論你是一個(gè)VB.NET程序員,或一個(gè)C#程序員,甚至是使用托管的C++的程序員。只要被編譯成IL就是同等的。 首先,編譯輸出的exe是一個(gè)由中間語言(IL),元數(shù)據(jù)(Metadata)和一個(gè)額外的被編譯器添加的目標(biāo)平臺(tái)的標(biāo)準(zhǔn)可執(zhí)行文件頭(比如Win32平臺(tái)就是加了一個(gè)標(biāo)準(zhǔn)Win32可執(zhí)行文件頭)組成的PE(portable executable,可移植執(zhí)行體)文件,而不是傳統(tǒng)的二進(jìn)制可執(zhí)行文件 —— 雖然他們有著相同的擴(kuò)展名。

  中間語言是一組獨(dú)立于CPU的指令集,它可以被即時(shí)編譯器Jitter翻譯成目標(biāo)平臺(tái)的本地代碼。中間語言代碼使得所有Microsoft.NET平臺(tái)的高級(jí)語言C#, VB.NET, VC.NET等得以平臺(tái)獨(dú)立,以及語言之間實(shí)現(xiàn)互操作。元數(shù)據(jù)是一個(gè)內(nèi)嵌于PE文件的表的集合。
  5、版本控制

  由于使用了元數(shù)據(jù),所以你可以使用XCOPY簡單的復(fù)制就可以了,而CLR也可以在運(yùn)行時(shí)期讀取元數(shù)據(jù),以確保多版本程序運(yùn)行在同一進(jìn)程中。使用公共語言運(yùn)行庫的程序集的所有版本控制都在程序集級(jí)別上進(jìn)行。一個(gè)程序集的特定版本和依賴程序集的版本在該程序集的清單中記錄下來。除非被配置文件(應(yīng)用程序配置文件、發(fā)行者策略文件和計(jì)算機(jī)的管理員配置文件)中的顯式版本策略重寫,否則運(yùn)行庫的默認(rèn)版本策略是,應(yīng)用程序只與它們生成和測試時(shí)所用的程序集版本一起運(yùn)行。
  6、.NET安全

  .NET提供了一組安全方案。負(fù)責(zé)進(jìn)行代碼的訪問安全性檢查。允許我們對(duì)保護(hù)資源和操作的訪問。代碼需要經(jīng)過身份確認(rèn)和出處鑒別后才能得到不同程度的信任。安全策略是一組可配置的規(guī)則,公共語言運(yùn)行庫在決定允許代碼執(zhí)行的操作時(shí)遵循此規(guī)則。安全策略由管理員設(shè)置,并由運(yùn)行庫強(qiáng)制。

  運(yùn)行庫確保代碼只能訪問安全策略允許的資源和調(diào)用安全策略允許的代碼。 每當(dāng)發(fā)生加載程序集的嘗試時(shí),運(yùn)行庫就使用安全策略確定授予程序集的權(quán)限。在檢查了描述程序集標(biāo)識(shí)的信息(稱為證據(jù))后,運(yùn)行庫使用安全策略決定代碼的信任程度和由此授予程序集的權(quán)限。證據(jù)包括但不僅限于代碼的出版商、它的站點(diǎn)以及它的區(qū)域。安全策略還確定授予應(yīng)用程序域的權(quán)限。
  7、簡單的組件互操作性。
  8、自描述組件:
自描述組件是指將所有數(shù)據(jù)和代碼都放在一個(gè)文件中的執(zhí)行文件。自描訴組件可以大大簡化系統(tǒng)的開發(fā)和配置,并且改進(jìn)系統(tǒng)的可靠性。

  通用語言運(yùn)行時(shí)(CommonLanguageRuntiome, CLR)最早被稱為下一代Windows服務(wù)運(yùn)行時(shí)(NGWS Runtime)。它是直接建立在操作系統(tǒng)上的一個(gè)虛擬環(huán)境,主要的任務(wù)是管理代碼的運(yùn)行。CLR現(xiàn)在支持幾十種現(xiàn)代的編程語言為它編寫代碼,然后以一種中間語言(Intermediate Langeoage, IL)代碼的形成被執(zhí)行。并且,CLR還提供了許多功能以簡化代碼的開發(fā)和應(yīng)用配置,同時(shí)也改善了應(yīng)用程序的可靠性。如你所知,如果某種語言的編譯器是以運(yùn)行時(shí)為目標(biāo)的,那么利用該語言開發(fā)生成的代碼在.NET中被稱為托管代碼,因?yàn)檫@樣的代碼是直接運(yùn)行在CLR上的,所以具有與平臺(tái)無關(guān)的特點(diǎn)。

  在.NET平臺(tái)結(jié)構(gòu)圖中,CLR的上面是.NET的基類庫,這組基類庫包括從基本輸入輸出到數(shù)據(jù)訪問等各方面,提供了一個(gè)統(tǒng)一的面向?qū)ο蟮模瑢哟位模蓴U(kuò)展的編程接口。從.NET平臺(tái)結(jié)構(gòu)圖中也可以看到,基類庫可以被各種語言調(diào)用和擴(kuò)展,也就是說不管是C#,VB.NET還是VC++.NET,都可以自由的調(diào)用.NET的類庫,因?yàn)镃#自身只有77個(gè)關(guān)鍵字,而且語法對(duì)程序員來說無需費(fèi)工夫?qū)W習(xí)。 BCL則相反,它包含了4500個(gè)以上的類和無數(shù)的方法、屬性,在你的C#程序中隨時(shí)都可能會(huì)用到它來完成自己的任務(wù)。

  還有一個(gè)很重要的概念你需要明白,這就是公共語言架構(gòu)(Common Language Infrastructure, CLI). CLI是CLR的一個(gè)子集,也就是.NET中最終對(duì)編譯成MSIL代碼的應(yīng)用程序的運(yùn)行環(huán)境進(jìn)行管理的那一部分。在CLR結(jié)構(gòu)圖中CLI位于下半部分,主要包括類加載器(Class Loader)、實(shí)時(shí)編譯器(IL To Native Compilers)和一個(gè)運(yùn)行時(shí)環(huán)境的垃圾收集及將使用任何語言編寫的代碼,通過其特定的編譯器轉(zhuǎn)換為MSIL代碼之后運(yùn)行其上,甚至還可以自己寫 MSIL在CLI上運(yùn)行。

  9、調(diào)用和配置

  當(dāng)運(yùn)行庫試圖解析對(duì)另一個(gè)程序集的引用時(shí),就開始進(jìn)行定位并綁定到程序集的進(jìn)程。該引用可以是靜態(tài)的,也可以是動(dòng)態(tài)的。在生成時(shí),編譯器在程序集清單的元數(shù)據(jù)中記錄靜態(tài)引用。動(dòng)態(tài)引用是由于調(diào)用各種方法而動(dòng)態(tài)構(gòu)造的,例如 System.Reflection.Assembly.Load 方法。 引用程序集的首選方式就是使用完全引用,包括程序集名稱、版本、區(qū)域性和公鑰標(biāo)記(如果存在)。

  運(yùn)行庫就會(huì)使用這些信息來定位程序集。無論是對(duì)靜態(tài)程序集的引用還是對(duì)動(dòng)態(tài)程序集的引用,運(yùn)行庫均使用相同的解析過程。 還可通過向調(diào)用方法僅提供有關(guān)程序集的部分信息的方式(例如僅指定程序集名稱),對(duì)程序集進(jìn)行動(dòng)態(tài)引用。在這種情況下,僅在應(yīng)用程序目錄下搜索程序集,不進(jìn)行其他檢查。您可以使用不同加載程序集方法中的任何方法(例如 System.Reflection.Assembly.Load 或 AppDomain.Load)進(jìn)行部分引用。如果希望運(yùn)行庫在全局程序集緩存和應(yīng)用程序目錄下檢查引用的程序集,可以用 System.Reflection.Assembly.LoadWithPartialName 方法指定部分引用。

  最后,可以使用諸如 System.Reflection.Assembly.Load 之類的方法進(jìn)行動(dòng)態(tài)引用并只提供部分信息;然后在應(yīng)用程序配置文件中用 <qualifyAssembly> 元素限定該引用。該元素使您可以在應(yīng)用程序配置文件中而不是在代碼中提供完全引用信息,包括名稱、版本、區(qū)域性和公鑰標(biāo)記(如果適用)。如果要在應(yīng)用程序目錄外完全限定對(duì)某個(gè)程序集的引用,或者如果要引用全局程序集緩存中的程序集,但又希望方便地在配置文件中而不是在代碼中指定完全引用,就可以采用這一技術(shù)。

  10、GC

  一個(gè)跟蹤過程,它傳遞性地跟蹤指向當(dāng)前使用的對(duì)象的所有指針,以便找到可以引用的所有對(duì)象,然后重新使用在此跟蹤過程中未找到的任何堆內(nèi)存。公共語言運(yùn)行庫垃圾回收器還壓縮使用中的內(nèi)存,以縮小堆所需要的工作空間。 垃圾收集器的基本算法很簡單: ● 將所有的托管內(nèi)存標(biāo)記為垃圾 ● 尋找正被使用的內(nèi)存塊,并將他們標(biāo)記為有效 ● 釋放所有沒有被使用的內(nèi)存塊 ● 整理堆以減少碎片。

  CLR的基本特性

  1、與本機(jī)代碼無關(guān) - MSIL (中間語言)

  2、讓我們使用同一種語言 - CLR (公共語言運(yùn)行時(shí))

  3、我們手中的零件 - Assembly (裝配件)

  4、讓我們?cè)谕粋€(gè)系統(tǒng)中運(yùn)行 - CTS (通用類型系統(tǒng))

  5、宇宙大爆炸后的產(chǎn)物 - metadata (元數(shù)據(jù))

  6、讓我們的語言可以交流 - CLS (公共語言系統(tǒng))

  7、在動(dòng)態(tài)中交互 - Reflection (反射)

  8、屬于我們自己的空間 - NameSpace (名稱空間)

MSIL:微軟中間語言

Reflection:反射

Metadata:元數(shù)據(jù)

PE:可執(zhí)行可移植文件

Assembly: 程序集(裝配件)

NameSpace:名稱空間

CTS:通用類型系統(tǒng)

GC(Garbage Colection) :無用單元回收

CLR:公共語言系統(tǒng)

Attribute:屬性(注意不要和Property混淆)

Boxing: 裝箱

UnBoxing: 拆箱

  MSIL 使用.NET支持的語言所編寫的代碼

  MSIL(Microsoft Intermediate Language)微軟的中間語言。和Java的虛擬機(jī)類似,是與CPU無關(guān)的指令集。當(dāng)編譯為托管代碼時(shí),編譯器將源代碼翻譯為MSIL, 如上圖所示。MSIL包括用于加載、存儲(chǔ)和初始化對(duì)象以及對(duì)對(duì)象調(diào)用方法的指令,還包括用于算術(shù)和邏輯運(yùn)算、控制流、直接內(nèi)存訪問、異常處理和其他操作的指令。在可以執(zhí)行代碼前,必須將 MSIL 轉(zhuǎn)換為 CPU 特定的代碼,這通常是通過實(shí)時(shí) (JIT) 編譯器完成的。由于公共語言運(yùn)行庫為它支持的每種計(jì)算機(jī)結(jié)構(gòu)都提供了一種或多種 JIT 編譯器,因此可以在任何受支持的結(jié)構(gòu)上對(duì)同一組 MSIL 進(jìn)行 JIT 編譯和執(zhí)行。這樣總結(jié)上面的就是:中間語言是一組獨(dú)立于CPU的指令集,它可以被即時(shí)編譯器Jitter翻譯成目標(biāo)平臺(tái)的本地代碼。

  PE

  Windows PE和一個(gè) .NET PE的主要區(qū)別在于Windows PE是由操作系統(tǒng)執(zhí)行的,而 .NET PE 卻被轉(zhuǎn)變成為.NET Framework的CLR. 識(shí)別一個(gè)PE是 .NET還是Windows取決于他的通用的目標(biāo)文件格式 (COFF) 是否使用Windows的操作系統(tǒng)。目標(biāo)文件格式 (COFF) 指定了任何文件都分成兩個(gè)部分:文件數(shù)據(jù)本身以及描述文件內(nèi)包含的數(shù)據(jù)內(nèi)容的頭文件串。MSIL 匯編程序從 MSIL 匯編語言生成可移植可執(zhí)行的 (PE) 文件。可以運(yùn)行結(jié)果可執(zhí)行文件(該文件包含 MSIL 和所需的元數(shù)據(jù))以確定 MSIL 是否按預(yù)期執(zhí)行。這就是我為什么會(huì)談到PE。

  那么PE文件是怎么執(zhí)行的呢?下面是一個(gè)典型的.NET應(yīng)用程序的執(zhí)行過程:

  1. 用戶執(zhí)行編譯器輸出的應(yīng)用程序(PE文件),操作系統(tǒng)載入PE文件,以及其他的DLL(.NET動(dòng)態(tài)連接庫)。
  2. 操作系統(tǒng)裝載器根據(jù)PE文件中的可執(zhí)行文件頭跳轉(zhuǎn)到程序的入口點(diǎn)。顯然,操作系統(tǒng)并不能執(zhí)行中間語言,該入口點(diǎn)也被設(shè)計(jì)為跳轉(zhuǎn)到mscoree.dll(.NET平臺(tái)的核心支持DLL)的_CorExeMain()函數(shù)入口。
  3. CorExeMain()函數(shù)開始執(zhí)行PE文件中的中間語言代碼。這里的執(zhí)行的意思是CLR(通用語言運(yùn)行時(shí))按照調(diào)用的對(duì)象方法為單位,用JIT(即時(shí)編譯器)將中間語言編譯成本地機(jī)二進(jìn)制代碼,執(zhí)行并根據(jù)需要存于機(jī)器緩存。
  4. 程序的執(zhí)行過程中,GC(垃圾收集器)負(fù)責(zé)內(nèi)存的分配,釋放等管理功能。
  5. 程序執(zhí)行完畢,操作系統(tǒng)卸載應(yīng)用程序。

  .NET Framework 環(huán)境

  下面的插圖顯示公共語言運(yùn)行時(shí)和類庫與應(yīng)用程序之間以及與整個(gè)系統(tǒng)之間的關(guān)系。該插圖還顯示托管代碼如何在更大的結(jié)構(gòu)內(nèi)運(yùn)行。

  公共語言運(yùn)行時(shí)(CLR)的功能

  公共語言運(yùn)行時(shí)管理內(nèi)存、線程執(zhí)行、代碼執(zhí)行、代碼安全驗(yàn)證、編譯以及其他系統(tǒng)服務(wù)。這些功能是在公共語言運(yùn)行時(shí)上運(yùn)行的托管代碼所固有的。

  • 至于安全性,取決于包括托管組件的來源(如 InterNET、企業(yè)網(wǎng)絡(luò)或本地計(jì)算機(jī))在內(nèi)的一些因素,托管組件被賦予不同程度的信任。

  • 運(yùn)行時(shí)強(qiáng)制實(shí)施代碼訪問安全。例如,用戶可以相信嵌入在網(wǎng)頁中的可執(zhí)行文件能夠在屏幕上播放動(dòng)畫或唱歌,但不能訪問他們的個(gè)人數(shù)據(jù)、文件系統(tǒng)或網(wǎng)絡(luò)。這樣,運(yùn)行時(shí)的安全性功能就使通過 InterNET 部署的合法軟件能夠具有特別豐富的功能。

  • 運(yùn)行時(shí)還通過實(shí)現(xiàn)稱為常規(guī)類型系統(tǒng) (CTS) 的嚴(yán)格類型驗(yàn)證和代碼驗(yàn)證基礎(chǔ)結(jié)構(gòu)來加強(qiáng)代碼可靠性。CTS 確保所有托管代碼都是可以自我描述的。各種 Microsoft 編譯器和第三方語言編譯器都可生成符合 CTS 的托管代碼。這意味著托管代碼可在嚴(yán)格實(shí)施類型保證和類型安全的同時(shí)使用其他托管類型和實(shí)例。

  • 此外,運(yùn)行時(shí)的托管環(huán)境還消除了許多常見的軟件問題。例如,運(yùn)行時(shí)自動(dòng)處理對(duì)象布局并管理對(duì)對(duì)象的引用,在不再使用它們時(shí)將它們釋放。這種自動(dòng)內(nèi)存管理解決了兩個(gè)最常見的應(yīng)用程序錯(cuò)誤:內(nèi)存泄漏和無效內(nèi)存引用。

  • 運(yùn)行時(shí)還提高了開發(fā)人員的工作效率。例如,程序員可以用他們選擇的開發(fā)語言編寫應(yīng)用程序,卻仍能充分利用其他開發(fā)人員用其他語言編寫的運(yùn)行時(shí)、類庫和組件。任何選擇以運(yùn)行時(shí)為目標(biāo)的編譯器供應(yīng)商都可以這樣做。以 .NET Framework 為目標(biāo)的語言編譯器使得用該語言編寫的現(xiàn)有代碼可以使用 .NET Framework 的功能,這大大減輕了現(xiàn)有應(yīng)用程序的遷移過程的工作負(fù)擔(dān)。

  • 盡管運(yùn)行時(shí)是為未來的軟件設(shè)計(jì)的,但是它也支持現(xiàn)在和以前的軟件。托管和非托管代碼之間的互操作性使開發(fā)人員能夠繼續(xù)使用所需的 COM 組件和 DLL。
  • 運(yùn)行時(shí)旨在增強(qiáng)性能。盡管公共語言運(yùn)行時(shí)提供許多標(biāo)準(zhǔn)運(yùn)行時(shí)服務(wù),但是它從不解釋托管代碼。一種稱為實(shí)時(shí) (JIT) 編譯的功能使所有托管代碼能夠以它在其上執(zhí)行的系統(tǒng)的本機(jī)語言運(yùn)行。同時(shí),內(nèi)存管理器排除了出現(xiàn)零碎內(nèi)存的可能性,并增大了內(nèi)存引用區(qū)域以進(jìn)一步提高性能。
  • 最后,運(yùn)行時(shí)可由高性能的服務(wù)器應(yīng)用程序(如 Microsoft SQL Server 和 InterNET 信息服務(wù) (IIS))承載。此基礎(chǔ)結(jié)構(gòu)使您在享受支持運(yùn)行時(shí)承載的行業(yè)最佳企業(yè)服務(wù)器的優(yōu)越性能的同時(shí),能夠使用托管代碼編寫業(yè)務(wù)邏輯。

  公共語言運(yùn)行時(shí)(CLR)細(xì)節(jié)

  • 若要使公共語言運(yùn)行時(shí)能夠向托管代碼提供服務(wù),語言編譯器必須生成一些元數(shù)據(jù)來描述代碼中的類型、成員和引用。元數(shù)據(jù)與代碼一起存儲(chǔ);每個(gè)可加載的公共語言運(yùn)行時(shí)可遷移執(zhí)行 (PE) 文件都包含元數(shù)據(jù)。公共語言運(yùn)行時(shí)使用元數(shù)據(jù)來完成以下任務(wù):查找和加載類,在內(nèi)存中安排實(shí)例,解析方法調(diào)用,生成本機(jī)代碼,強(qiáng)制安全性,以及設(shè)置運(yùn)行時(shí)上下文邊界。
  • 公共語言運(yùn)行時(shí)自動(dòng)處理對(duì)象布局并管理對(duì)象引用,當(dāng)不再使用對(duì)象時(shí)釋放它們。按這種方式實(shí)現(xiàn)生存期管理的對(duì)象稱為托管數(shù)據(jù)。垃圾回收消除了內(nèi)存泄漏以及其他一些常見的編程錯(cuò)誤。如果您編寫的代碼是托管代碼,則可以在 .NET Framework 應(yīng)用程序中使用托管數(shù)據(jù)、非托管數(shù)據(jù)或者同時(shí)使用這兩種數(shù)據(jù)。由于語言編譯器會(huì)提供自己的類型(如基元類型),因此您可能并不總是知道(或需要知道)這些數(shù)據(jù)是否是托管的。
  • 有了公共語言運(yùn)行時(shí),就可以很容易地設(shè)計(jì)出對(duì)象能夠跨語言交互的組件和應(yīng)用程序。也就是說,用不同語言編寫的對(duì)象可以互相通信,并且它們的行為可以緊密集成。例如,可以定義一個(gè)類,然后使用不同的語言從原始類派生出另一個(gè)類或調(diào)用原始類的方法。還可以將一個(gè)類的實(shí)例傳遞到用不同的語言編寫的另一個(gè)類的方法。這種跨語言集成之所以成為可能,是因?yàn)榛诠舱Z言運(yùn)行時(shí)的語言編譯器和工具使用由公共語言運(yùn)行時(shí)定義的常規(guī)類型系統(tǒng)(CTS),而且它們遵循公共語言運(yùn)行時(shí)關(guān)于定義新類型以及創(chuàng)建、使用、保持和綁定到類型的規(guī)則。
  • 所有托管組件都帶有生成它們所基于的組件和資源的信息,這些信息構(gòu)成了元數(shù)據(jù)的一部分。公共語言運(yùn)行時(shí)使用這些信息確保組件或應(yīng)用程序具有它需要的所有內(nèi)容的指定版本,這樣就使代碼不太可能由于某些未滿足的依賴項(xiàng)而發(fā)生中斷。注冊(cè)信息和狀態(tài)數(shù)據(jù)不再保存在注冊(cè)表中(因?yàn)樵谧?cè)表中建立和維護(hù)這些信息很困難)。取而代之的是,有關(guān)您定義的類型(及其依賴項(xiàng))的信息作為元數(shù)據(jù)與代碼存儲(chǔ)在一起,這樣大大降低了組件復(fù)制和移除任務(wù)的復(fù)雜性。
  • 語言編譯器和工具公開公共語言運(yùn)行時(shí)的功能的方式對(duì)于開發(fā)人員來說不僅很有用,而且很直觀。這意味著,公共語言運(yùn)行時(shí)的某些功能可能在一個(gè)環(huán)境中比在另一個(gè)環(huán)境中更突出。您對(duì)公共語言運(yùn)行時(shí)的體驗(yàn)取決于所使用的語言編譯器或工具。例如,如果您是一位 Visual Basic 開發(fā)人員,您可能會(huì)注意到:有了公共語言運(yùn)行時(shí),Visual Basic 語言的面向?qū)ο蟮墓δ鼙纫郧岸嗔恕?/li>

  .NET Framework 類庫

  • .NET Framework 類庫是一個(gè)與公共語言運(yùn)行時(shí)緊密集成的可重用的類型集合。該類庫是面向?qū)ο蟮模⑻峁┠约旱耐泄艽a可從中導(dǎo)出功能的類型。這不但使 .NET Framework 類型易于使用,而且還減少了學(xué)習(xí) .NET Framework 的新功能所需要的時(shí)間。此外,第三方組件可與 .NET Framework 中的類無縫集成。

NET技術(shù)C#技術(shù)漫談之公共語言運(yùn)行庫(CLR),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 宅男噜噜噜66一区二区 | 亚洲人成人网 | 成人精品免费视频 | 欧美精品久久久久 | 亚洲精品视频播放 | 亚洲精品欧美 | 国产高清在线视频 | 国内自拍视频在线观看 | av黄色在线 | 国产亚洲精品一区二区三区 | 99精品久久 | 国产伦精品一区二区三区精品视频 | 欧美一区视频 | 久久成人国产 | 久久天天躁狠狠躁夜夜躁2014 | 久青草影院 | 午夜三级视频 | 日韩国产在线观看 | 国产美女黄色片 | 色综合久久88色综合天天 | 成人福利在线 | 综合久久av | 免费在线成人 | 欧美一级片 | www.av在线 | 日韩精品在线观看免费 | 日本国产高清 | 国产色婷婷精品综合在线手机播放 | 一区二区三区免费在线观看 | 亚洲视频www | 久久久久久久一区 | 久久久久久国产精品免费免费 | 99综合| 成人a视频片观看免费 | 草久久久 | 中国一级特黄真人毛片免费观看 | 国产精品久久国产精品久久 | 久久精品欧美一区二区三区不卡 | 国产成人午夜精品影院游乐网 | 一级毛片在线播放 | 中文字幕在线精品 |