概念:
CLR :
公共語言運行時(Common Language Runtime) 是一個可由多種編程語言使用的"運行時",它負責資源管理(內存分配和垃圾收集等),並保證應用和底層操作系統之間必要的分離。CLR的核心功能(內存管理、程序集加載、安全性、異常處理和線程同步)可由面向CLR的所有語言使用。
通俗一點說就是:不管是c# 、c++、 vb、f#、甚至是java等各編譯器面向CLR的語言,都可以借用CLR里已經實現的核心功能。
例如:CLR使用異常報告錯誤,因此,面向它的任何語言都能通過異常來報告錯誤;CLR允許創建線程,所以面向它的任何語言都能創建線程
托管模塊:
用支持CLR的任何一種語言創建的源代碼文件,再經過相應的編譯器檢查語法和分析源代碼,編譯生成。
是一個標准的32位的可移植執行體(PE32)文件或一個標准的64位可移植執行體(PE32+)文件,它們都需要CLR才能執行。下圖:是將源代碼編譯成托管模塊的過程
托管模塊的組成:
以上是關於托管模塊高大上版本的介紹,以下我再接地氣的以C#語言作為主角介紹以下
程序員寫完一段優美的c#代碼后,會通過自帶的編譯器編譯,生成托管模塊,托管模塊在一個可移植的PE文件中(如 .exe 、.dll)
PE文件里的托管模塊,你可以當做c#的一個類,類里有四個屬性,一個PE頭(介紹該文件的信息),一個CLR頭(描述這個對象的整體的一些信息,比如main入口),元數據(這個很關鍵,一種元數據表包含源代碼中定義的那些那些類型和成員的描述信息,另一種包含引用的類型和成員的描述信息),IL代碼(也很關鍵:就是你的源代碼被編譯后的代碼,又稱中間語言)。
托管模塊的主要組成就是IL與元數據: IL代碼有時候也叫托管代碼,因為CLR管理它的執行 元數據就是對這段c#源代碼的描述
元數據有很多用途:其中有一條大家肯定曉得: Microsoft Visual Studio 用元數據幫助你寫代碼。“智能感知”(IntelliSense)技術會解析元數據,告訴你一個類型提供了那些方法、屬性、事件和字段。對於方法,還能告訴你需要的參數。
托管模塊可合並成為程序集
程序集(assembly)是一個抽象概念:
由一或者多個模塊/資源文件的邏輯性組合。程序集是重用、安全性以及版本控制的最小單元。在CLR世界中,程序集相當於“組件”。托管模塊合並程序集如下圖
該圖將 一些托管模塊 與 一些資源文件 交給一個工具處理,生成一個PE32(+)文件,這些托管模塊與資源文件合並到了一起,並多了一個清單(清單的作用類似於元數據對托管代碼的作用)。
執行程序集:
程序集同時包含 元數據與IL。IL是與CPU不相關的代碼,不是機器語言,計算機無法運行,這個時候就需要強大的CLR了!