大家首先要清楚的是,.NET平台與C#不是一回事.這點大家一定要明白,對開發人員來講他有兩個概念。第一,它是C#,VB.net等程序運行的平台。第二,它因為為這些語言提供了豐富的類庫(稱之為基類庫),.NET CLR是什么我們現在來一起看看吧。
NET CLR是什么
對於一個將要面向.NET平台進行開發的人來說,了解一下.NET平台的整個構成是非常有必要的,如圖1所示即說明了.NET平台的整體結構:
這個圖就是著名的.NET平台結構圖,從這個圖上可以看到,.NET Framework是在Microsoft.NET平台上開發的基礎,ASP.NET、Windows Forms 和VS.NET都不過是.NET平台開發的一部分,他的用於.NET應用程序的開發及展示。.NET平台的核心技術為:通用語言運行時(CLR:Common Language Runtiome)、基類庫(BCL:Base Class Library)、.NET語言及Visual Studio.NET
從這個圖上可以看出,.NET Framework是架構在Windows平台上的一個虛擬的運行平台,你可以想象將最下層Windows換做其他的操作系統,例如說Linux,一樣可以實現使用符合CLS(Common Language Specification,通用語言規范)的.NET語言,(VB.NET、C#、JScript.NET等),來創建ASP.NET或Windows Form(可能會叫Linux Forms)應用程序的功能,這其實就是Mono計划要實現的功能。所以可以這么認為,理論上,C#是一種可以跨平台的語言,這很象Java。C#另一個比較象Java的地方是,它也是一種(特殊意義上的)語言,同Java一樣,C#編寫的程序代碼也是先通過C#編譯器編譯為一種特殊的字節代碼, (Microsoft Intermediate Language,MSIL,微軟)中間語言,運行時再經由特定的編譯器(JIT編譯器,Just In tIME, JITer)編譯為機器代碼,以供操作系統執行.
不僅是C#語言,所有.NET語言(將會包括我們常用的幾十種現代的編碼語言)都可以編寫面向CLR的程序代碼,這種代碼在.NET中被稱為托管代碼(Managed Code),所有的Managed Code都直接運行在CLR上,具有與平台無關的特性。
解釋性的語言很安全,並且可以通過他的運行平台為其賦予更多的功能,例如自動內存管理,異常處理等,事實上,C#語言的許多特點都是由CLR提供的,如圖2所示的CLR結構圖說明了這一點。
從圖2可以看到,C#所具有的許多特點都是由CLR提供的,如類型安全(Type Checker)、垃圾回收(Garbage Collector)、異常處理(Exception Manager)、向下兼容(COM Marshaler)等,具體的說,.NET上的CLR為開發者提供如下的服務:
◆平台無關:CLR實際上是提供了一項使用了虛擬機技術的產品,他構架在操作系統之上,並不要求程序的運行平台是 Windows系統,只要是能夠支持它的運行庫的系統,都可以在上面運行.NET應用。所以,一個完全由托管代碼組成的應用程序,只要編譯一次,就可以在任何支持.NET的平台上運行.
◆跨語言集成:CLR語序開發這以任何語言進行開發,用這些語言開發的代碼,可以在CLR環境下緊密無縫的進行交叉調用,例如,可以用VB聲明一個基類對象,然后在C#代碼中直接創建次基類的派生類。
◆自動內存管理:CLR提供了拉架收集機制,可以自動管理內存。當對象或變量的生命周期結速后,CLR會自動釋放他們所占用的內存.
◆跨語言異處理
◆版本控制
◆.NET安全
◆簡單的組件互操作性。
◆自描述組件:自描述組件是指將所有數據和代碼都放在一個文件中的執行文件。自描訴組件可以大大簡化系統的開發和配置,並且改進系統的可靠性。
通用語言運行時(CommonLanguageRuntiome,CLR)最早被稱為下一代Windows服務運行時(NGWS Runtime).它是直接建立在操作系統上的一個虛擬環境,主要的任務是管理代碼的運行。CLR現在支持幾十種現代的編程語言為它編寫代碼,然后以一種中間語言(Intermediate Langeoage,IL)代碼的形成被執行。並且,CLR還提供了許多功能以簡化代碼的開發和應用配置,同時也改善了應用程序的可靠性。如你所知,如果某種語言的編譯器是以運行時為目標的,那么利用該語言開發生成的代碼在.NET中被稱為托管代碼,因為這樣的代碼是直接運行在CLR上的,所以具有與平台無關的特點。
在.NET平台結構圖中,CLR的上面是.NET的基類庫,這組基類庫包括從基本輸入輸出到數據訪問等各方面,提供了一個統一的面向對象的,層次化的,可擴展的編程接口。從.NET平台結構圖中也可以看到,基類庫可以被各種語言調用和擴展,也就是說不管是 C#,VB.NET還是VC++.NET,都可以自由的調用,.NET的類庫,因為C#自身只有77個關鍵字,而且語法對程序員來說無需費工夫學習。 BCL則相反,它包含了4500個以上的類和無數的方法,屬性,在你的C#程序中隨時都可能會用到它來完成自己的任務.
還有一個很重要的概念你需要明白,這就是公共語言架構(Common Language Infrastructure,CLI).CLI是CLR的一個子集,也就是.NET中最最終對編譯成MSIL代碼的應用程序的運行環境進行管理的那一部分。在CLR結構圖中CLI位於下半部分,主要包括類加載器(Class Loader)、實時編譯器(IL To Native Compilers)和一個運行時環境的垃圾收集及將使用任何語言編寫的代碼,通過其特定的編譯器轉換為MSIL代碼之后運行其上,甚至還可以自己寫 MSIL在CLI上運行.以上就是介紹.NET CLR是什么。