文章目錄
- 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,在保證了很高的相容性的同時,做了大量的改進工作,在之後的一系列部落格中,我們團隊的成員會進一步作更為具體的介紹,敬請大家期待。