什麼是.NET?
起源:比爾蓋茨在2000年的Professional Developers Conference介紹了一個嶄新的平台叫作Next Generation Windows Service,也就是後來的.NET。
軟件層:.NET可以被看作是介於操作系統和編程語言之間的軟件層,它可以支持多種編程語言,包括C#,VB.NET,C++,F#,等等。
用來產生托管代碼的框架、平台:傳統的編譯方式是"源代碼→編譯→可執行文件",在.NET中編譯方式是"源代碼→編譯→程序集→可執行文件"。編譯後的程序集包含IL代碼和元數據,在運行時再轉換成機器代碼。
按開發到執行階段來說:開發階段.NET提供了龐大的類庫,在程序執行階段,.NET提供了一個CLR運行時環境幫助我們實時編譯程序、進行安全檢查、執行垃圾回收,管理內存等。
規范:.NET包含了眾多的規范,比如CIL,BCL, FCL, CTS, CLS,等等。
什麼是IL?
IL,Intermediage Language,中間語言,並不是CPU可以直接執行的本地機器語言,在轉換成計算機可以識別的指令之前,還要進行一個被稱為"Just in time"的二次編譯過程。在.NET框架下,任何語言,比如C++,VB.NET,C#,等等,在經過各自的編譯器編譯之後,都會被轉換成中間語言。IL還有另外的2種叫法:CIL,Common Intermediate Language;MSIL, Microsoft Intermediate Language。
查看IL代碼,參考這裡:http://www.cnblogs.com/darrenji/p/3967669.html
什麼是CLI?
CLI,Common Language Infrastructure, 公用語言基礎, .NET的各種規范都遵循了這個標准。
什麼是BCL?
BCL, Basic Class Library, .NE為我們提供的基類庫。
創建一個控制台項目。
把鼠標停留在Console上,並按F12。
發現Console是System的成員,點擊System。
發現System是mscorlib的成員,點擊mscorlib。
發現mscorlib是一個程序集,位於C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll
也就是mscorlib包含了.NET的基類庫。
string類型是否屬於基類庫呢?
把鼠標停留在string關鍵字上,並按F12。
發現string實際上是System.String類型,原來.NET為我們把關鍵字string和CLI標准System.String作了映射。
依此類推, btye映射了System.Byte, short映射了System.Int16, 等等。
像string, byte, short,等等,這些都是基元類型。所以,凡是把語言本省的關鍵字與CLI的類型映射起來的,都叫基元類型。
什麼是FCL?
FCL, Framework Class Library, 框架類庫,提供的類庫更多,BCL是FCL的子集。比如,在ASP.NET MVC下提供了System.Web.MVC。
什麼是CTS?
CTS, Common Type System, 公共類型系統。CTS規定了在編程語言中可以定義的方面,包括:類、結構、委托,類中的方法、字段、屬性、事件等,還定義了一些約束,比如所有類型都隱式繼承自System.Object類型。
什麼是CLS?
CLS, Common Language Specification, 公共語言規范,必須完全符合CTS的標准,是CTS的子集。比如C#編譯生成的程序集有很多類,VB編譯生成的程序集也有很多類,現在VB編譯需要引用C#程序集的某個類,怎麼辦呢?
我們需要讓C#程序集中,需要被引用的這個類符合CLS規范,.NET為我們准備了CLSCompliant特性。
[assembly:CLSCompliant(true)]public class SomeClass{}
什麼是CLR?
CLR, Common Language Runtime, 公用語言運行時。IL代碼需要通過CLR進行即時編譯才能轉換成機器代碼。大致過程是:
編程語言代碼編譯生成程序集。程序集中的PE/COFF頭包含了供Windows操作系統查看和使用的信息;CLR頭告訴操作系統這是一個.NET程序集;程序集清單描述了程序集本身的信息,比如程序集標識、程序集包含的資源、組成程序集的文件,等等;元數據描述了程序集包含的內容,比如包含的模塊、類型、類型成員、類型成員的可見性,等等。
CLR開始工作:管理應用程序域,加載和運行程序集, 安全檢查, 將IL代碼JIT編譯成機器代碼,異常處理, 垃圾回收,等等。
相關文章:
CLR如何加載程序集以及程序集版本策略 http://www.cnblogs.com/darrenji/p/4179916.html
查看是否安裝.NET Framework、.NET Framework的版本號、CLR版本號 http://www.cnblogs.com/darrenji/p/3977406.html
CLR是如何被加載並工作的 http://www.cnblogs.com/darrenji/p/4159259.html
什麼是JIT?
JIT, just in time, 即時編譯。在CLR中,把IL轉換成機器代碼的工作交給了JIT編譯器。即時編譯只在方法第一次被調用時發生。