天天看點

CLR 這些年有啥變化嗎?

CLR 這些年有啥變化嗎?

CLR 作為.Net 程式跨平台運作的載體,和Java的JVM有着類似的功能.随着.NET Framework的日益發展,CLR這些年又有哪些變化了?

首先想給初學者推薦下《CLR via C#》這本好書,做.Net開發的開發者應該都讀一下。為避免廣告之嫌,是以這裡隻提供豆瓣書評的連結。

CLR 作為.Net 程式跨平台運作的載體,和Java的JVM有着類似的功能(JAVA為跨平台而生,實作這一目标離不開JVM)。

随着.NET Framework的日益發展CLR也有日新月異的變化。這些變化為開發帶來更多有用的特性,在提高開發效率的同時也提高了程式的性能和穩定性。

如果大家覺得還有必要把這塊更新的更好,還請多多回報。

如果覺的對您有用還請點選 “推薦”下,我會持續更新更多新的内容。

通用語言運作時(CommonLanguageRuntime,CLR)最早被稱為下一代Windows服務運作時(NGWS Runtime).它是直接建立在作業系統上的一個虛拟環境,主要的任務是管理代碼的運作。
CLR 這些年有啥變化嗎?

.NET平台結構圖

CLR現在支援幾十種現代的程式設計語言為它編寫代碼,然後以一種中間語言(Intermediate Language,IL)代碼的形成被執行。并且,CLR還提供了許多功能以簡化代碼的開發和應用配置,同時也改善了應用程式的可靠性。如你所知,如果某種語言的編譯器是以運作時為目标的,那麼利用該語言開發生成的代碼在.NET中被稱為托管代碼(MSIL),因為這樣的代碼是直接運作在CLR上的,是以具有與平台無關的特點。

目前有哪些語言支援CLR

微軟已經為多種語言開發了基于CLR的編譯器,這些語言包括:C++/CLI、C#、Visual Basic、F#、Iron Python、 Iron Ruby和IL。 除此之外,其他的一些公司和大學等機構也位一些語言開發了基于CLR的編譯器,例如Ada、APL、Caml、COBOL、Eiffel、Forth、Fortran、Haskell、Lexicon、LISP、LOGO、Lua、Mercury、ML、Mondrian、Oberon、Pascal、Perl、PHP、Prolog、RPG、Scheme、Smaltak、Tcl/Tk。

在.NET平台結構圖中,CLR的上面是.NET的基類庫,這組基類庫包括從基本輸入輸出到資料通路等各方面,提供了一個統一的面向對象的,階層化的,可擴充的程式設計接口。從.NET平台結構圖中也可以看到,基類庫可以被各種語言調用和擴充,也就是說不管是 C#,VB.NET還是F#,VC++.NET,都可以自由的調用.NET的類庫。

CLR 這些年有啥變化嗎?

從上圖可以看到CLR提供的功能,如類型安全(Type Checker)、垃圾回收(Garbage Collector)、異常處理(Exception Manager)、向下相容(COM Marshaler)等,具體的說,.NET上的CLR為開發者提供如下的服務:

平台無關:CLR實際上是提供了一項使用了虛拟機技術的産品,他在作業系統之上,并不要求程式的運作平台是 Windows系統,隻要是能夠支援它的運作庫的系統,都可以在上面運作.NET應用。是以,一個完全由托管代碼組成的應用程式,隻要編譯一次,就可以在任何支援.NET的平台上運作.(從Mono的出現變得更加真實啦,不用再羨慕JAVA啦)

跨語言內建:CLR語序開發這以任何語言進行開發,用這些語言開發的代碼,可以在CLR環境下緊密無縫的進行交叉調用,例如,可以用VB聲明一個基類對象,然後在C#代碼中直接建立次基類的派生類。

自動記憶體管理:CLR提供了拉架收集機制,可以自動管理記憶體。當對象或變量的生命周期結速後,CLR會自動釋放他們所占用的記憶體.

跨語言異常處理

版本控制(避免了DLL災難)

.NET安全

簡單的元件互操作性。

自描述元件:自描述元件是指将所有資料和代碼都放在一個檔案中的執行檔案。自描述元件可以大大簡化系統的開發和配置,并且改進系統的可靠性。

補充:大家可以看下我總結的一篇有關GC的一些東西(GC 快餐熱賣)

CLR 這些年有啥變化嗎?

CLR 在整個.Net Framework 程式執行過程的模型,C#、VB.Net,C++.Net 代碼通過編譯器生成了MSIL(托管代碼),然後CLR用JIT翻譯成native code ,最後就可以直接執行啦。

CLR 這些年有啥變化嗎?

C#版本 和.Net Framework 版本以及CLR依賴關系 和新特性添加清單,

The .NET Framework 4.5 is an in-place update that replaces the .NET Framework 4 on your computer, and similiarly, the .NET Framework 4.5.1 4.5.2, and 4.6 RC are in-place updates to the .NET Framework 4.5, which means that they use the same runtime version, but the assembly versions are updated and include new types and members. After you install one of these updates, your .NET Framework 4 or .NET Framework 4.5 apps should continue to run without requiring recompilation. However, the reverse is not true. We do not recommend running apps that target a later version of the .NET Framework on the .NET Framework 4.5.

上面的總體意思就是:

.NET Framework 4.5 是.NetFramework 4.0的代替者

.NET Framework 4.5.1 4.5.2, and 4.6 RC 是.NetFramework 4.5的代替者

從.net 4 開始,如果您想把.NetFramework 4.0+ 到更新的更新版本的.NetFramework,隻需重新指定目标.Net Framwork然後重新編譯代碼即可,反之不可行。

之是以可以這樣做是因為這幾個.NetFramework版本的CLR都是4.0版本的。

The .NET Framework versions 2.0, 3.0, and 3.5 are built with the same version of the CLR (CLR 2.0). These versions represent successive layers of a single installation. Each version is built incrementally on top of the earlier versions. It is not possible to run versions 2.0, 3.0, and 3.5 side by side on a computer. When you install version 3.5, you get the 2.0 and 3.0 layers automatically, and apps that were built for versions 2.0, 3.0, and 3.5 can all run on version 3.5. However, the .NET Framework 4 ends this layering approach. Starting with the .NET Framework 4, you can use in-process side-by-side hosting to run multiple versions of the CLR in a single process. For more information, see Assemblies and Side-by-Side Execution. In addition, if your app targets version 2.0, 3.0, or 3.5, your users may be required to enable the .NET Framework 3.5 on a Windows 8 or Windows 8.1 computer before they can run your app. For more information, see Installing the .NET Framework 3.5 on Windows 8 or 8.1

這段話的意思是

.NET Framework versions 2.0, 3.0, and 3.5 每個版本都是在前一個版本基礎上增量開發的

.NET Framework versions 2.0, 3.0, and 3.5 不同版本的程式不能在同一機器上同時運作在不同CLR上。(在安裝 3.5 版後,你将無需安裝 2.0 和 3.0 版本,2.0、3.0 和 3.5 生成的應用程式均可在 3.5 版上運作)

從 .NET Framework 4 開始,在單個程序中可使用程序内并行運作在多個版本的CLR 。(即4.0的dll引用了2.0的dll是,4.0的代碼在CLR4.0上運作而2.0的代碼運作在CLR2.0上)

此外,如果你的應用程式使用的是 2.0、3.0 或 3.5 版,你的使用者可能需要先在(Windows7) Windows 8 或 Windows 8.1計算機上啟用 .NET Framework 3.5,然後才能運作應用程式。

Update2:因@yubinfeng提醒,注釋下:3.5的Framework都在Win7以後的版本中系統自帶,隻是預設不啟用,需要時開【控制台】->【程式和功能】->[打開或關閉Windows功能]->打開.NetFramework 3.5功能即可。(安裝.netframework 不是本文的重點,如需更詳細的介紹自行搜尋下)

順便看下 各個.Net Framework 新功能:

CLR 這些年有啥變化嗎?
CLR 這些年有啥變化嗎?

未來.NEtFrameWork 會有新的兄弟進來一起建構.Net 跨平台和雲架構的夢想。

CLR 這些年有啥變化嗎?

上圖中Core CLR是Asp .Net vNext很重要的核心之一,雖然官方沒說,但基本上就是一個精簡版的CLR,拿掉了繪圖等功能,讓Server和Cloud程式更高效

至于MonoCLR,大家看名字就知道是為了更好的支援Mono這個開源的新秀的。

Update1:摘自MSDN的《使用 CoreCLR 編寫 Silverlight》

自 2005 年 10 月發行 CLR 的 2.0 版本後就開始了 CoreCLR 的設計。它的兩個主要設計目标是大小和相容性:從程式設計人員的角度來看,針對 CLR 的編碼應該始終相同,而從使用者的角度來看,下載下傳必須非常小。由于 Silverlight 旨在提供一組不同于桌面 CLR 的方案,是以,我們可以進行一些更改,以簡化 CoreCLR 并允許我們縮減 Silverlight 的安裝大小。但是,堆棧底部的一緻性至關重要。行為差異(即使這些行為差異都正确)表明堆棧上部有錯誤。 為了確定相容性,我們在堆棧底部的各個元件中使用相同的代碼。執行引擎和虛拟機都是相同的。其中包括類型系統和中繼資料、垃圾回收器 (GC)、JIT 編譯器、線程池以及運作時引擎的其他核心部件。 但是,為了适應 Web 應用程式方案,進行了一些更改。例如,富 Internet 應用程式通常簡單且運作時間短,JIT 編譯器主要側重于減少啟動時間,而非執行更複雜的優化操作。同樣,伺服器垃圾回收模式可以對使用相似配置設定模式的多個工作線程進行優化,而對 Web 托管應用程式則行不通。是以,Silverlight 隻包含針對互動式應用程式進行優化的标準工作站 GC。但是,在 Silverlight 應用程式中使用 Microsoft 中間語言 (MSIL) 和中繼資料的方式與在針對桌面的托管應用程式中的使用方式完全相同,而且應用程式的行為在使用者的桌面上和在浏覽器上一緻。 事實上,Silverlight 并不打算取代桌面 CLR,這就引發了核心引擎中最大的變化:CoreCLR 将與桌面 CLR 程序并行運作。

GitHub 上的開源庫CoreCLR

公共語言運作時 (CLR)

.NET Framework Versions and Dependencies(MSDN關于.NetFramework 各個版本和系統的依賴關系)

The Future of .NET in the Server: ASP.NET vNext optimized for Cloud and Server workloads

.NET Versioning and Multi-Targeting - .NET 4.5 is an in-place upgrade to .NET 4.0 。

ntroduction to the Common Language Runtime (CLR)

魅力 .NET:從 Mono、.NET Core 說起

釐清 CLR、.NET、C#、Visual Studio、ASP.NET 各版本之間的關係

2015-7-12 :

更新了關于CoreCLR 部分介紹

添加了關于.NetFramework 3.5的在Win7,8,8.1無需安裝,隻需啟用該功能即可

作者:<b>旭東</b>

出處:http://www.cnblogs.com/HQFZ

關于作者:專注于微軟平台項目架構、管理和企業解決方案。現主要從事WinForm、ASP.NET、WPF、WCF、等方面的項目開發、架構、管理。如有問題或建議,請不吝指教!

本文版權歸作者,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。如有問題,可以聯系我,非常感謝。

如果您該文覺得不錯或者對你有幫助,請點下推薦,讓更多的朋友看到,謝謝!