CLR 4 新特性 —— 概覽

來源:互聯網
上載者:User
文章目錄
  • CLR 簡介
  • 託管與本地代碼的互操作
  • 記憶體回收
  • 代碼約定
  • Corrupted state exception
  • 新的安全模型
  • 同一個進程,多個CLR
  • 基本類庫

.NET 4中發布了最新版本的通用語言執行平台,簡稱CLR (Common Language Runtime) 。這個版本是CLR 2.0之後又一個新的版本,包含著CLR小組幾年以來的辛勤工作。

我們團隊(CLR上海團隊)計劃在未來的幾個月內陸續介紹其中的一些特性,本文作為一個概覽,先作蜻蜓點水,拋磚引玉。也歡迎大家回複本文,告訴我們你所感興趣的話題,我們會進一步作深入的介紹。

CLR 簡介

CLR作為.NET架構中最為底層的組件,扮演著運行Managed 程式碼虛擬機器的角色,承擔著諸如即時編譯(Just In Time Compile),記憶體回收(Garbage Collect)等任務。打一個比方,如果把作業系統看做是運行二進位程式的宿主,那麼CLR就是託管世界的作業系統。

圖一 CLR 在.NET架構中所處的位置

CLR作為.NET架構中的一部分,總是跟著.NET發行,但是近年來.NET的發行版本從2.0一直到3.5, 但是CLR卻還一直保留在2.0,如下表所示:

.NET架構版本

時間

CLR

1.0

2002.2

1.0

1.1

2003.4

1.1

2.0 (Generics)

2006.1

2.0

3.0 (WPF/WCF/WF)

2006.11

2.0

3.5 (LINQ)

2007.11

2.0

4.0 Beta

2009.5

4.0

圖二 CLR 版本

大家可以看到,2.0的發行已經是三年之前的事情了,在這幾年中,CLR小組的工作最後都彙集在了這次發行之中,可謂是眾星雲集,下面我們一一敘來。

託管與本地代碼的互操作

Managed 程式碼與本地代碼之間的互操作(interop)擔負著.NET世界對外聯絡的責任。比如調用一個本地dll或者COM組件。在CLR 4中,我們作了以下工作,來提高互操作的易用性。

1. 自訂QI(Custom QI)

當Managed 程式碼被COM調用的時候,它扮演著COM組件的角色。對於COM組件來說,IUnknown::QueryInerface(QI)是類型轉化的關鍵。CLR4之前,為每個託管COM組件提供了一個QI實現; CLR4 允許使用者自訂QI,大家可以從mscorlib中新增的interface,System.Runtime.InteropServices.ICustomQueryInterface著手瞭解這一新功能。

2. TlbImp原始碼以及自訂工具

在Managed 程式碼中調用COM組件,需要這個COM組件用託管語言申明自己的介面,也就是Interop Assembly(IA)。在一般情況下,使用者不需要自己動手撰寫這些assembly,而可以使用TlbImp這個工具,根據TLB產生IA。在CLR 4的開發中,我們用Managed 程式碼把TlbImp重寫了,並且把原始碼公布在了codeplex上面。

發布TlbImp的原始碼的好處之一,是方便使用者根據自己的需求,通過修改原始碼來自拓展TlbImp的功能。我們也收集了很多客戶需要自訂TlbImp的要求,並且提取了一些呼聲最高的自訂請求,製作了TlbImp自訂工具,也在codeplex發行。詳見http://blogs.msdn.com/silverlightshanghai/archive/2009/03/13/codeplex-tlbimp.aspx

3. 等價類別型

前面提到,COM組件要為.NET所用,需要Interop Assembly。不同版本的COM組件,帶來了部署上的問題。在CLR 4.0之中,我們通過等價類別型的引入,就部署IA的問題,給出了更好的解決方案。

4. 其他

Interop其他方面的改動,包括自訂Stub來處理Interop中的Marshalling和目標函數調用;使用COM取代了原先的遠程對象訪問;讓使用者自己決定清理RCW的時機等等,會有更為詳細的博文作具體介紹。

記憶體回收

記憶體回收一直是CLR中的核心模組,對託管程式啟動並執行效能至關重要。在這個版本中,CLR引入了background GC,和原來的Concurrent GC相比,在GC進行的過程中,會更少的阻斷其他進程,從而提高整個CLR的運行效率。同時,此前在sp2中引入的GC::RegisterForFullGCNotification可以讓 CLR4.0可以通知使用者第二代GC發生,從而使伺服器有機會處理Server Load Balancer,使得整個伺服器端的處理能力不至於因為GC的發生受到太大的影響。

代碼約定

在CLR4.0中,引入了代碼約定,更方便使用者規範代碼的行為,大家可以從System.Diagnostics.Contracts這一命名空間著手,進一步瞭解其內容。

Corrupted state exception

CLR 4.0中,對異常處理的哲學有了一個改進:在預設情況下,try/catch語句將不能捕獲諸如AccessViolationException等異常。因為這些異常的損毀(Corrupt)了機器的狀態(state),即使使用者捕獲了它們,也無法繼續執行代碼,或者說,繼續執行代碼也會變得非常危險。

新的安全模型

用過CLR v2的安全模型的朋友們可能還會記得諸如Evidence,Policy以及Permission等概念,這些複雜的對象一起構築了v2的安全模型的架構,CLR4.0中,安全模型被大大簡化,SecurityCritical,SecurSafeCritical等一些安全層級構築了新的安全模型的基礎。

同一個進程,多個CLR

CLR4.0的出現,又添加了一個CLR的版本,儘管我們盡量保證各個不同版本之間的相容性,但是還是可能出現一些已經開發的組件,需要特定的版本才能運行。為了確保使用者過去編寫的組件不會因為新的CLR版本而不能運行,CLR4.0中允許使用者在一個進程中,運行不同的CLR版本,這樣不同的組建就可以各取所需,運行在適合他們的CLR中了。

基本類庫

基本類庫,也就是mscorlib.dll,包括了諸如System.Object這樣在整個類型系統中最為核心的類庫。CLR4.0也包含了很多新功能:比如用於支援動態語言的System.Tuple,新的集合類型System.Collections.Generic.SortedSet,用於提高檔案系統瀏覽效能的API,操作註冊表的API,以及對記憶體對應檔的支援等等。

 

總的來說,CLR4.0相較於CLR2.0,在保證了很高的相容性的同時,做了大量的改進工作,在之後的一系列部落格中,我們團隊的成員會進一步作更為具體的介紹,敬請大家期待。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.