1. .NET Framework
是支持生成和運行下一代應用程序和 XML Web services 的內部 Windows 組件。.NET Framework 具有兩個主要組件:公共語言運行庫(Common Language Runtime)和 .NET Framework 類庫(Framework Class Library)。
2. 公共語言運行庫)(Common Language Runtime)
是 .NET Framework 的基礎。可以將運行庫看作一個在執行時管理代碼的代理,它提供內存管理、線程管理和遠程處理等核心服務,並且還強制實施嚴格的類型安全以及可提高安全性和可靠性的其他形式的代碼准確性。事實上,代碼管理的概念是運行庫的基本原則。以運行庫為目標的代碼稱為托管代碼,而不以運行庫為目標的代碼稱為非托管代碼。以下是CLR提供的服務:
Ø 代碼管理(加載和執行)
Ø 應用程序內存隔離
Ø 類型安全驗證
Ø IL 到本機代碼的轉換
Ø 對元數據(增強型類型信息)的訪問
Ø 托管對象內存的管理
Ø 代碼訪問安全性的強制
Ø 異常處理,包括語言間異常
Ø 托管代碼、COM 對象和預先存在的 DLL(非托管代碼和數據)間的相互操作
Ø 對象布局的自動化
Ø 對開發人員服務的支持(分析、調試等等)
3. .NET Framework 類庫(Framework Class Library)
它是一個綜合性的面向對象的可重用類型集合,可以使用它開發多種應用程序,這些應用程序包括傳統的命令行或圖形用戶界面 (GUI) 應用程序,也包括基於 ASP.NET 所提供的最新創新的應用程序(如 Web 窗體和 XML Web services)。它可以完成以前要通過Windows API來完成的絕大多數任務。
4. 托管代碼 (managed code)
由公共語言運行庫環境(而不是直接由操作系統)執行的代碼。托管代碼應用程序可以獲得公共語言運行庫服務,例如自動垃圾回收、運行庫類型檢查和安全支持等。這些服務幫助提供獨立於平台和語言的、統一的托管代碼應用程序行為。托管代碼有以下優點:
Ø 平台無關性。源代碼先編譯成中間語言,運行時由CLR將中間語言編譯成平台專用的代碼,跟Java的字節代碼一樣,這樣即可實現平台無關性。
Ø 提高性能。首先,IL比Java的字節碼作用還要大,因為IL是即時編譯的,而Java的字節碼常常是解釋性的,在轉換為平台可執行代碼的時候可能會導致性能損失。其次,.NET的即時編譯器(JIT)(Just In Time)並非一次把全部代碼編譯完才執行,而是只編譯調用的那部分代碼,並把得到的這部分內部可執行代碼保存起來,下次需要調用的時候無須重新編譯。Microsoft認為這個過程要比一開始編譯整個應用程序代碼的效率高得多,因為任何程序的大部分代碼實際上並不是在每次運行過程中都執行。最後,傳統的編譯器會優化代碼,但它們的優化過程是獨立於代碼所運行的特定處理器的。例如Visual Studio 6優化了一台一般的Pentium機器,它所生成的代碼就不能利用Pentium Ш處理器的硬件特性。而JIT與平台無關,所以它可以針對不同的機器完成不同的優化。
Ø 語言的互操作性。互操作性即能將任何一種語言編譯為中間代碼,編譯好的代碼可以與從其它語言編譯過來的代碼進行交互操作。在.NET中可以交互操作的語言有C#、VB.NET、Visual C++.NET、Visual J#、腳本語言、COM和COM+。
5. 非托管代碼(Unmanaged Code)
在公共語言運行庫環境的外部,由操作系統直接執行的代碼。非托管代碼必須提供自己的垃圾回收、類型檢查、安全支持等服務;它與托管代碼不同,後者從公共語言運行庫中獲得這些服務。
6. 中間語言(MSIL)
中間語言(MSIL)在.NET Framework中有非常重要的作用,所有面向.NET的語言都要先編譯成IL,那麼它們在邏輯上都需要支持IL的 主要特征。MSIL是將.Net代碼轉化為機器語言的一個中間過程。它是一種介於高級語言和基於Intel的匯編語言的偽匯編語言。當用戶編譯一 個.Net程序時,編譯器將源代碼翻譯成一組可以有效地轉換為本機代碼且獨立於CPU 的指令。當執行這些指令時,實時(JIT)編譯器將它們轉化為CPU特定的代碼。由於公共語言運行庫支持多種實時編譯器,因此同一段MSIL代碼可以被不 同的編譯器實時編譯並運行在不同的結構上。從理論上來說,MSIL將消除多年以來業界中不同語言之間的紛爭。在.Net的世界中可能出現下面的情況:一部 分代碼可以用Effil實現,另一部分代碼使用C#或VB完成的,但是最後這些代碼都將被轉換為中間語言。這給程序員提供了極大的靈活性,程序員可以選擇 自己熟悉的語言,並且再也不用為學習不斷推出的新語言而煩惱了。
7. CTS(Common Type System,通用類型系統)
類 型是數據的一種表達方式,不同編程語言定義的基本數據類型各不相同。既然要實現語言之間的“溝通”,就需要一個規范來實現“不同”數據類型(也許只是名稱 不同,而實質相同)間的映射關系。便於使用.Net Framework在各種語言之間進行交互操作。CTS就完成這個工作。
8. JIT(Just-In-Time)
從全稱也可以看出:強調實時,也就是中間代碼實時執行時,才針對本地計算機的不同,被編譯成本機代碼。
9. 程序集(Assembly)
是.NET 程序的最小組成單位。每個程序集都有自己的名稱、版本等信息。程序集通常表現為一個文件(.exe或.dll文件),這樣的程序集被稱為單文件程序集,這 種程序集是最常見的。程序集也可以由多個文件組成,每個文件都是一個模塊文件或者是一個資源文件,這樣的程序集被稱為多文件程序集。下面來了解一下如何生 成單文件程序集和多文件程序集。
10. PE(可移植可執行Portable Executable)文件
PE文件是一個非常重要的概念,它由PE表頭、CLR表頭、元數據和IL(中間語言)代碼四部分組成。
Ø PE表頭:主要指出了文件的類型,GUI(圖形用戶)、CUI(控制台)或是DLL(在.NET中DLL特指程序集文件的一種形式,不同於以前的動態鏈接庫文件)。
另外該表頭還包括一個時間標記用於表示文件創建的時間。對於僅包含IL代碼的模塊該表頭的大部分信息會被忽略。對於包含有本地CPU代碼的模塊,
該表頭還會包含有關本地CPU代碼的一些信息。
Ø CLR表頭:包含標識托管模塊的一些信息(可以被CLR或者一些使用工具解析)。這些信息包括托管模塊所需要的CLR版本號,一些標記,托管模塊入口點
方法(MethodDef)元數據標記,以及有關托管模塊的元數據、資源、強命名標記和其他一些意義不是太大的信息的位置和尺寸。
Ø 【元數據】(表):該表用於描述代碼中用到的類型和成員,描述的類型和成員有兩類,一是源代碼中定義,一是引用的。元數據總是和包含IL代碼的文件
相關聯,實際上元數據總是和這些代碼一起被嵌入到同一個exe/dll文件中,編譯器總是同時產生元數據和IL代碼,並且總是同時將它們嵌入到生產的托管模
塊中,兩者始終保持同步。
元數據的用處:
@元數據省去了源代碼編譯時對頭文件和庫文件的需求。這是因為在含有實現類型和成員的IL代碼文件中,已經包含了所有被引用的類型和成員的信息,
編譯器可以直接從托管模塊中讀取元數據來獲得這些信息。
@Visual Studio.NET的智能感知(Intellisense)功能是通過分析元數據來實現的。
@CLR代碼驗證過程可以利用元數據來確保代碼僅執行“安全”的操作。
@利用元數據,可以將一個對象的字段序列化後發送到遠程機器,然後在遠程機器上執行反序列化,從而重新創建對象和它的狀態。
@利用元數據,垃圾收集器可以追蹤對象的生存期。對於任何對象,垃圾收集器都能通過元數據來確定該對象的類型,並且可以獲知該對象的哪些字段引
用了其他對象。
Ø IL代碼:編譯器在編譯源代碼是產生的指令,CLR運行時將它們編譯成本地CPU指令。
11. 托管模塊(managed module
托管模塊是一個需要CLR才能執行的可移植可執行(Portable executeable 簡稱PE) 文件。