一、CLR、CLI、CTS、CLS、BCL、FCL簡介
CLI(公共語言基礎)
CLI是微軟公司向ECMA提交的一份語言和數據格式規范,CLR是目前為止唯一一個公共語言基礎的實現版本。CLI包括了公共類型系統(CTS)、公共中間語言(CIL)、底部文件格式以及元數據格式等。
CLR(公共語言運行庫)
CLR是一個CLI的實現,包含了.NET運行引擎和符合CLI的類庫。我們開發的幾乎所有的.NET程序都基于CLR的類庫來實現,并且運行在CLR提供的運行引擎之上。
CTS(公共類型系統)
CTS定義了一個能夠在CLR上運行的語言規范。盡管有很多語言本身不符合CTS規范,但是通過加強編譯器,改變語言附加規范等手段,使得許多語言能夠編寫出能在CLR上運行的程序。一種語言編寫的程序編譯能夠在CLR上運行,并不代表這種語言本身完全符合CTS的規范。例如C++語言,仍然保持了其不符合CTS規范的部分,并且在編譯時把這部分不符合CTS的代碼編譯成原始代碼而非中間代碼。
CLS(公共語言規范)
CLS是CTS的一個子集,它定義了希望編寫在.NET平臺上運行的程序的語言所需符合的最小規范。正因為.NET允許由不同語言編寫的程序一起執行,所以才制定出CLS規范,用以避免不同語言特性產生的錯誤。在.NET Framework中,幾乎所有(但不是所有)的類都是與CLS兼容的。在MSDN文檔說明中,不兼容的類和方法都被特別標記為不兼容,例如System命名空間中的UInt32結構。UInt32表示32位無符號整數。并不是所有的語言(例如Visual Basic.NET或J#)都支持無符號的數據類型,這種數據類型是與CLS不兼容的。
BCL,基礎類庫(Base Class Library)
BCL是一個公共編程框架,稱為基類庫,所有語言的開發者都能利用它。是CLI(Common Language Infrastructure,公共語言基礎結構)的規范之一,主要包括:執行網絡操作,執行I/O操作,安全管理,文本操作,數據庫操作,XML操作,與事件日志交互,跟蹤和一些診斷操作,使用非托管代碼,創建與調用動態代碼等,粒度相對較小,為所有框架提供基礎支持。
FCL,框架類庫(Framework Class Library)
FCL提供了大粒度的編程框架,它是針對不同應用設計的框架 ,FCL大部分實現都引用了BCL,例如我們常說的開發框架:ASP.NET(Core)、Windows Forms、WPF等等,提供了針對不同層面的編程框架 。
二、CLR
通用語言執行平臺(Common Language Runtime,簡稱CLR)是微軟為他們的.NET的虛擬機所選用的名稱。它是微軟對通用語言架構(CLI)的實現版本,它定義了一個代碼執行的環境。CLR執行一種稱為通用中間語言的字節碼,這個是微軟的通用中間語言實現版本。CLR目前已穩定運行于各個平臺之中。
CLR 和類庫與應用和整個系統的關系

來源 :https://docs.microsoft.com/tr-tr/dotnet/framework/get-started/overview CLR 組件

來源 :https://www.slideshare.net/Thenmurugeshwari/architecture-of-net-framework
在 CLR 中,垃圾回收器充當自動內存管理器。C# 以及 CLR 之上的其他語言的內存都是通過垃圾回收器回收的。
CLR 主要功能
基類庫支持 Base Class Library Support
內存管理 Memory Management
線程管理 Thread Management
垃圾回收 Garbage Collection
安全性 Security
類型檢查 Type Checker
異常管理 Exception Manager
調試管理 Debug Engine
中間碼(MSIL)到機器代碼(Native)編譯
類別裝載 Class Loader
開發人員使用高級編程語言編寫程序。接下來編譯器將代碼編譯成微軟的中繼語言(MSIL)。執行的時候CLR會將MSIL碼轉換為操作系統的原生碼(Native code)。CLR內置有即時編譯器。實際上,CLR代理了一部分傳統操作系統的管理功能,通常將在CLR的控制下運行的代碼稱為托管代碼,否則稱為非托管代碼。
執行流程
將源代碼(vb、cs)編譯成托管代模塊。托管代碼塊由中間語言和元數據組成。將托管代碼合并成程序集。加載公共語言運行庫。執行程序集的代碼。生成本地代碼。
優點
它通過在運行時提供程序之間提供豐富的交互來提高性能。通過消除在支持程序的任何操作系統上重新編譯程序的需要來增強可移植性。安全性也會提高,因為它會分析MSIL指令是安全的還是不安全的。此外,使用委托代替函數指針增強了類型的安全性。在垃圾回收器的幫助下支持自動內存管理。提供跨語言集成,因為 CLR 中的 CTS 提供了一個通用標準,該標準激活了不同的語言以擴展和共享彼此的庫。支持使用在其他 .NET 編程語言中開發的組件。提供語言、平臺和體系結構獨立性。它允許輕松創建可擴展的多線程應用程序,因為開發人員無需考慮內存管理和安全問題。