複製鏈接
請複製以下鏈接發送給好友

公共語言運行庫

鎖定
公共語言運行庫 (common language runtime,CLR) 是託管代碼執行核心中的引擎。運行庫為託管代碼提供各種服務,如跨語言集成、代碼訪問安全性、對象生存期管理、調試和分析支持。它是整個.NET框架的核心,它為.NET應用程序提供了一個託管的代碼執行環境。它實際上是駐留在內存裏的一段代理代碼,負責應用程序在整個執行期間的代碼管理工作。
中文名
公共語言運行庫
外文名
common language runtime,CLR
地    位
它是整個.NET框架的核心
工作方式
通過編譯器和工具公開
優    勢
使不同語言編寫的對象可互相通信
本    質
駐留在內存裏的一段代理代碼

公共語言運行庫定義

公共語言運行庫(Common Language Runtime,CLR)是整個.NET框架的核心,它為.NET應用程序提供了一個託管的代碼執行環境。它實際上是駐留在內存裏的一段代理代碼,負責應用程序在整個執行期間的代碼管理工作,比較典型的有:內存管理、線程管理、安全管理、遠程管理、即使編譯、代碼強制安全類檢查等,這些都可以成為.NET框架的生命線。 [1] 

公共語言運行庫組成元素及其功能

(1)類加載器:管理元數據,加載和在內存中佈局類;
(2)Micorsoft 中間語言(MSIL)到本地代碼編譯器:通過即時編譯把Micorsoft 中間語言轉換為本地代碼;
(3)代碼管理器:管理和執行代碼;
(4)垃圾回收器:為NET.Framework下的所有對象提供自動生命期管理,支持多處理器,可擴展;
(5)安全引擎:提供基於證據的安全,基於用户身份和代碼來源;
(6)調試器:使開發者能夠調試應用程序和根據代碼執行;
(7)類型檢查器:不允許不安全的類型轉換和未初始化變量MSIL可被校驗以保證類型安全。
(8)異常管理器:提供和Windows結構化異常處理集成的異常處理機制;
(9)線程支持:提供多線程編程支持;
(10)COM封送拆收器:提供和COM組件之間的封送轉換;
(11).NET Framwork類庫支持:通過和運行時集成代碼來支持.NET Framwork類庫。 [1] 
實際上,CLR代理了一部分傳統操作系統的管理功能,通常將在CLR的控制下運行的代碼稱為託管代碼,否則稱為非託管代碼 [1] 

公共語言運行庫工作方式

公共語言運行庫的功能通過編譯器和工具公開,可以編寫利用此託管執行環境的代碼。使用基於公共語言運行庫的語言編譯器開發的代碼稱為託管代碼;託管代碼具有許多優點,例如:跨語言集成、跨語言異常處理、增強的安全性、版本控制和部署支持、簡化的組件交互模型、調試和分析服務等。 [2] 
若要使公共語言運行庫能夠向託管代碼提供服務,語言編譯器必須生成一些元數據來描述代碼中的類型、成員和引用。元數據與代碼一起存儲;每個可加載的公共語言運行庫可移植執行 (PE) 文件都包含元數據。公共語言運行庫使用元數據來完成以下任務:查找和加載類,在內存中安排實例,解析方法調用,生成本機代碼,強制安全性,以及設置運行時上下文邊界。 [3] 
公共語言運行庫自動處理對象佈局並管理對象引用,當不再使用對象時釋放它們。按這種方式實現生存期管理的對象稱為託管數據。垃圾回收消除了內存泄漏以及其他一些常見的編程錯誤。如果您編寫的代碼是託管代碼,則可以在 .NET Framework 應用程序中使用託管數據、非託管數據或者同時使用這兩種數據。由於語言編譯器會提供自己的類型(如基元類型),因此您可能並不總是知道(或需要知道)這些數據是否是託管的。 [2] 
有了公共語言運行庫,就可以很容易地設計出對象能夠跨語言交互的組件和應用程序。也就是説,用不同語言編寫的對象可以互相通信,並且它們的行為可以緊密集成。例如,可以定義一個類,然後使用不同的語言從原始類派生出另一個類或調用原始類的方法。還可以將一個類的實例傳遞到用不同的語言編寫的另一個類的方法。這種跨語言集成之所以成為可能,是因為基於公共語言運行庫的語言編譯器和工具使用由公共語言運行庫定義的通用類型系統,而且它們遵循公共語言運行庫關於定義新類型以及創建、使用、保持和綁定到類型的規則。 [3] 
所有託管組件都帶有生成它們所基於的組件和資源的信息,這些信息構成了元數據的一部分。公共語言運行庫使用這些信息確保組件或應用程序具有它需要的所有內容的指定版本,這樣就使代碼不太可能由於某些未滿足的依賴項而發生中斷。註冊信息和狀態數據不再保存在註冊表中(因為在註冊表中建立和維護這些信息很困難)。取而代之的是,有關您定義的類型(及其依賴項)的信息作為元數據與代碼存儲在一起,這樣大大降低了組件複製和移除任務的複雜性。 [4] 
語言編譯器和工具公開公共語言運行庫的功能的方式對於開發人員來説不僅很有用,而且很直觀。這意味着,公共語言運行庫的某些功能可能在一個環境中比在另一個環境中更突出。您對公共語言運行庫的體驗取決於所使用的語言編譯器或工具。例如,如果您是一位 Visual Basic 開發人員,您可能會注意到:有了公共語言運行庫,Visual Basic 語言的面向對象的功能比以前多了。 [4] 

公共語言運行庫功能

跨語言集成,特別是跨語言繼承。
垃圾回收,它管理對象生存期,使引用計數變得不再必要。
自我描述的對象,它使得使用接口定義語言 (IDL) 不再是必要的。
編譯一次即可在任何支持公共語言運行庫的 CPU 和操作系統上運行的能力。
還可以使用 C# 語言編寫託管代碼。C# 語言提供了下列優點:
完全面向對象的設計。
非常強的類型安全
很好地融合了 Visual Basic 的簡明性和 C++ 的強大功能。
垃圾回收。
類似於 C 和 C++ 的語法和關鍵字。
使用委託取代函數指針,從而增強了類型安全和安全性。函數指針通過 unsafe C# 關鍵字和 C#編譯器(Csc.exe) 的 /unsafe 選項可用於非託管代碼和數據。

公共語言運行庫執行模型

1、將源代碼(vb、cs)編譯成託管代模塊。託管代碼塊由中間語言元數據組成。
2、將託管代碼合併成程序集
3、加載公共語言運行庫。
4、執行程序集的代碼。
5、生成本地代碼 [2] 

公共語言運行庫優點

(1)性能得到了改進;
(2)能夠輕鬆使用用其他語言開發的組件;
(3)類庫提供的可擴展類型。 [2] 
(4)新的語言功能,如面向對象的編程的繼承、接口和重載;允許創建多線程的可縮放應用程序的顯式自由線程處理支持;結構化異常處理自定義屬性支持。 [5] 
如果使用 Microsoft® Visual C++® .NET,則可以使用 C++ 託管擴展來編寫託管代碼。C++ 託管擴展提供了託管執行環境以及對您所熟悉的強大功能和富於表現力的數據類型的訪問等優點。
參考資料
  • 1.    胡曉宏,薛京麗主編 ..NET框架程序設計.北京:中國水利水電出版社,2015:3-4
  • 2.    王國勝,張石磊編著.C#基礎與案例開發詳解.北京:清華大學出版社,2014:17-18
  • 3.    唐植華,郭興峯編著.ASP.NET2.0動態網站開發基礎教程(C#2005篇).北京:清華大學出版社,2008:2-3
  • 4.    楊文海等著..NET安全揭秘.北京:機械工業出版社,2012:2-3
  • 5.    張冬旭,馬春興編著 .C#編程從基礎到應用 .北京:清華大學出版社,2014:3-4