C#、.NET Framework、CLR的關係程序員
不少人沒有將C#、.NET Framework(.NET框架)、CLR(Common Language Runtime,公共語言運行庫)這三者之間的關係區分清楚,認爲其版本號是一一對應的。其實否則,.NET框架是一個獨立發佈的軟件包,其包含了CLR、類庫以及相關的語言編輯器等工具。C#代碼通過編譯以後在CLR環境中運行。因爲.NET框架3.0/3.5實際上是.NET2.0的擴展(只是增長了一些新的程序集),因此.NET3.0/3.5的CLR版本仍是2.0.並且.NET3.0其實只擴展了WF、WPF、WCF、WCS等組件,並無提供新的C#編譯器,直到.NET3.5中才打包了C#3.0的編譯器。.NET4.0在3.0上針對WF、WCF進行了一些新功能增長,因此.NET框架、CLR和C#的版本之間的對應關係以下表所示:編程
也就是說,對於那些不涉及新程序集的C#3.0新特性(好比自動屬性、匿名屬性等)在.NET2.0的環境中也能夠運行,CLR對這些特性是一無所知的。數組
一、C#是一種面向對象編程語言,是爲開發.NET框架上的程序而設計的。緩存
(1)C#是由C和C++衍生出來的,因此其可調用由 C/C++ 編寫的本機原生函數,同時不損失C/C++原有的強大的功能。安全
(2)C#所開發的程序源代碼並非編譯成可以直接在操做系統上執行的二進制本地代碼。它是被編譯成爲中間代碼,而後經過.NET框架的虛擬機(即CLR)來執行。因此若是計算機上沒有安裝.Net框架,那麼程序將不可以被執行。在執行的過程當中,.Net框架會將中間代碼翻譯成爲二進制機器碼,從而使它獲得正確的運行。最終翻譯的二進制代碼將被存儲在一個緩衝區中。因此一旦程序使用了相同的代碼,那麼將會調用緩衝區中的版本。這樣若是一個.Net程序第二次被運行,那麼這種翻譯不須要進行第二次,速度會明顯加快。服務器
二、.NET框架有三部分組成(以下圖):多線程
1)CLR的介紹參考3框架
2)編程工具:涵蓋了編碼和調試須要的一切:包含:VisualStudio集成開發環境、.NET兼容的編譯器(例如:C#、VB、JScript和託管的C++)、調試器、服務器端改進(好比ASP.NET)編程語言
3)BCL(Base Class Library,基類庫):是.NET框架使用的一個大的類庫,並且也能夠在你的程序中使用。包括如下一些類。編輯器
1>通用基礎類:這些類提供了一組極爲強大的工具,能夠應用帶普遍的編程任務中,好比字符串操做、安全和加密。
2>集合類:這些類實現了列表、字典、散列表以及位數組。
3>線程和同步類:這些類用於建立多線程程序。
4>XML類,這些類用於建立、讀取以及操做XML文檔。
三、CLR(公共語言運行庫)在運行期管理程序的執行:主要包含:內存管理、代碼安全驗證、代碼執行、垃圾收集。以下圖
(1)自動垃圾收集:CLR有一項服務稱爲GC(Garbage Collector,垃圾收集),它能爲你自動管理內存。
1)GC自動從內存中刪除程序再也不訪問的對象
2)GC是程序員再也不操心許多之前必須執行的任務,好比釋放內存和檢查內存泄漏。這可不是小特性,由於檢查內存泄漏可能很是困難並且耗時。
四、代碼的編譯過程:
(1)編譯成CIL:.NET語言的編譯器接受源代碼文件,並生成名爲程序集的輸出文件。程序集能夠是可執行文件或DLL(以下圖所示)
1>程序集裏的代碼並非本機代碼,而是一種名稱爲CIL(Common Intermediate Language,公共中間語言)的中間代碼。
2>程序集包含的信息中,包含下列項目:程序的CIL、程序中使用的類型的元數據、對其餘程序集引用的元數據
(2)編譯成本機代碼並執行:程序的CIL直到它被調用運行時纔會被編譯成本機代碼。在運行時,CLR執行下面的步驟(以下圖)
1>檢查程序集的安全特性
2>在內存中分配空間
3>把程序集中的可執行代碼發送給實時(Just-in-Time)編譯器,把其中的一部分編譯成本機代碼。
程序集中的可執行代碼在須要的時候由實時編譯器編譯,而後它就被緩存以備在後來的程序中執行,使用這個方法意味着不被調用的代碼不會被編譯成本機代碼,並且被調用到的代碼只被編譯一次。
一旦CIL被編譯成本機代碼,CLR就在它運行時管理它,執行像釋放無主內存、檢查數組邊界、檢查參數類型和管理異常之類的任務。這裏產生了兩個重要的術語:
託管代碼:爲.NET框架編寫的代碼稱爲託管代碼,須要CLR。
非託管代碼:不在CLR控制之下運行的代碼,好比Win32C/C++ DLL,成爲非託管代碼。
(3)編譯和執行綜述:不管原始源文件的語言是什麼,懂遵循一樣的編譯和執行過程。