任何基於.NET相關技術之程式都需仰賴CLR來運行,CLR是一個類似虛擬機的環境,讓程式在受控的環境下執行,CLR的出現簡化了、抽象化了我們撰寫之程式與電腦溝通的繁雜步驟,也簡化了我們程式開發的困難度。以下對CLR特色舉例:
微軟之所以會將虛擬機取名為通用語言執行環境(CLR),有一個很大的目的是為了達到跨語言互通性(cross-language interoperability),因此倡議了通用語言基礎架構(CLI)成為一個公開標準,其中CLR能使用的型別或語法都是依照CLI中的通用型別系統(Common type System,簡稱CTS)來定義,然而先前我們提到各個程式語言因為需求不同其編譯器實作功能有所不同,而為了達到跨語言整合各編譯器最少要實作的標準,是CTS中的一個最小規範-通用語言規範(Common Language Specification,簡稱CLS)。
CLR會管理我們程式執行時期的記憶體配置與記憶體釋放,而記憶體自動管理程序被稱為垃圾回收(Garbage Collection)。像是未有記憶體自動管理功能的程式語言,例如C及C++程式開發者在物件未用到時,需要自行撰寫程式對物件進行記憶體釋放,若忘了實作在新物件一直新增,就是,沒有使用時需要自己執行記憶體回收,而CLR有一個垃圾回收器(Garbage Collector)會定時執行偵測各個物件有無被參照,將未被參照的物件執行記憶體釋放,大幅降低記憶體流失(memory leak)的發生。
在安全方面,CLR會分析中繼碼指令是否安全,執行時期也會控管每一個變數確實會被指定的型別存取,也因為記憶體管理避免指標懸空(dangling pointer)參照了範圍之外的記憶體區段。
傳統程式在Windows上執行要進行程式安裝、註冊機碼等步驟後才能交由Windows來執行,以.NET來建置之程式省略上述步驟將程式相關資料(稱為中繼資料)連同IL打包成執行檔交由CLR來執行,因此也不會發生後來安裝之程式覆蓋原先程式使用之元件的窘境(如:DLL地獄),使得程式一旦能執行便能永遠執行,程式的移除也因為只要刪除執行檔而變得輕鬆如意。
CLR執行JIT會針對執行時的平台作指令集優化,將IL轉成適當的機器碼,其中JIT並不是一次性將所有程式碼編譯成機器碼,而是以方法為單位在該方法正要執行前才進行編譯,編譯後的機器碼會暫存於記憶體,待執行時期該方法的再次使用,當程式結束後執行時期終結則清除。也因為JIT與中繼資料讓我們的程式擁有如反射(Reflection)等執行期互動的能力。
程式的部屬被簡化,也因為IL與JIT,程式的可攜性提升,只要有對應平台的CLR存在,程式移植到不同平台變得容易。(不過微軟在.NET Core才開始實作官方跨平台的CLR。)
文章開頭說到任何基於.NET相關技術之程式都需仰賴CLR來運行,是受CLR控制(Managed)的,享受前述中CLR的總總功能,我們會說這些程式碼是受控程式碼(Managed Code)。但總會有需要外部元件(如C/C++撰寫之程式)或資料(如載入文字檔)的時候,CLR允許使用這些內容,但無法享受前述CLR中總總特色,例如記憶體釋放便要程式自己實作,我們稱這些為非受控的(Unmanaged)。