1、.NET Framework層次結構
FCL(Framework Class Library) |
BCL(Basic Class Library) |
CLR(Common Language Runtime) |
FCL:這是一個為開發人員提供的API類庫,比如我們經常使用的架構:Windows Forms、ASP.NET、WPF、WCF等。這一層是直接面向開發人員的。
BCL:這是處于底層的類庫,提供與作業系統層面互動的代碼,如:IO、線程管理
CLR:它為程式提供一個托管的執行環境,是.NET Framework的執行引擎。CLR與.NET的關系等同于JVM與Java的關系,CLR本質上就是.NET的虛拟機。
2、CLI
要實作跨平台,必須解決兩種類型的差異:程式設計語言的差異和運作時環境的差異。隻有程式設計語言之間能夠實作互相相容,運作時環境能夠得到統一,跨平台方可實作。CLI旨在解決這樣一個問題:由不同進階程式設計語言開發的.NET應用能夠在無須任何更改的情況下運作于不同的系統環境中。
CLI全稱:Common Language Infrastructure。其中Common Language指的是通用語言,旨在解決各種進階開發語言的相容性問題。Infrastructure指的是運作時環境,旨在彌補不同平台之間執行方式的差異。
程式設計語言分為編譯型和解釋型兩類。前者需要通過編譯器實施編譯以生成可執行代碼,CLI涉及的就是編譯型語言。要實作真正的跨平台,最終需要解決的是可執行代碼在不同平台之間的相容和可移植問題。如果不同程式設計語言經過編譯後生成的可執行代碼是一樣的,那麼程式設計語言之間的差異就不再是一個問題了。
2.1、CIL
按照CLI的規定,用來描述可執行代碼的是一種被稱為CIL(Common Intermediate Language)的語言,這是一種介于進階語言和機器語言之間的中間語言。雖然程式源檔案是由不同的程式設計語言編寫,但是我們可以借助相應的編譯器将其編譯成CIL代碼。從原則上講,設計新的程式設計語言并将其加入.NET中,隻需要以相應的編譯器來生成統一的CIL代碼即可。我們也可以設計一個編譯器,将java代碼編譯成以CIL為目智語言。這樣說的話,其實程式設計語言隻是表象,目标代碼(也稱可執行代碼)才是本質,因為目标代碼是直接與計算機打交道的。下面畫個圖來說明中間語言的作用吧。

程式設計語言的差異化通過編譯器得以統一化,運作環境的差異則可以通過虛拟機(VM)技術來解決。虛拟機是CIL的執行容器,能夠在執行CIL代碼的過程中采用即時編譯的方式将其動态地翻譯成與目前執行環境完全比對的機器指令。虛拟機屏蔽了不同作業系統之間的差異,使目标程式可以不做任何修改就能運作在不同的底層執行環境中。
那按照這個邏輯,.NET應用程式應該可以在非windows平台運作啊,為什麼在非windows平台還是無法運作呢?我個人的了解是:微軟沒有實作非windows平台的虛拟機,也就是CLR。也就是說微軟隻實作了windows平台的CLR,是以.NET應用程式隻能在windows平台執行。