天天看點

WP7-Silverlight CoreCLR結構淺析

轉自:http://www.infoq.com/cn/articles/silverlight-coreclr

Silverlight背後有強大的.Net平台支援,自Silverlight1.1開始它就使用CLR運作時環境,而Silverlight4更是将運作時環境更新為最新的.Net4.0版本。下面我們就來看看Silverlight CoreCLR裡面究竟有什麼?

我通過解壓Silverlight安裝程式了解其.Net的身份與豐富的基礎類庫。下圖是筆者解壓Silverlight4安裝程式後的檔案清單截圖:

WP7-Silverlight CoreCLR結構淺析

其中mainfest.XML是程式集清單檔案,而sllauncher.exe是Silverlight 脫浏覽器應用(OOB)的宿主啟動程式,而其餘動态連結庫檔案就是Silverlight4的運作時環境。如果你安裝了Silverlight運作時環境(當然還包括語言資源檔案),也可以在C:\Program Files\Microsoft Silverlight\下的對應版本檔案夾發現它們。而有心的讀者或許會意識到為什麼Silverlight不使用與.Net Framework一緻的程式集檔案,這一問題筆者在《Silverlight之輕》中已經給出了答案,現在我們就來看看C:\Windows\Microsoft.NET\Framework下對應主版本下的程式集檔案是否存在不同,以CLR核心程式集檔案mscorlib.dll為例,在Framework4.0下為5075KB,而在Silverlight4.0下則隻有1558KB大小。如果我們使用Reflector比較一下會發現,Silverlight類庫的精簡情況:

WP7-Silverlight CoreCLR結構淺析

Silverlight安裝檔案夾下npctrl.dll為浏覽器插件,為宿主浏覽器提供了Silverlight的插件式內建,同時也避免了JavaScript等對不同浏覽器的相容問題。如果使用depends工具檢視Silverlight安裝檔案夾下的npctrl.dll、coreclr.dll、agcore.dll的話,我們可以發現它們沒有通過.Net總入口MSCOREE.DLL程式集啟動,它們并不是Silverlight的.Net基礎類庫:

WP7-Silverlight CoreCLR結構淺析

如上圖所示,這些動态連結庫并不是托管程式,而是引用Windows的核心與API的底層接口,是負責與作業系統互動的核心運作檔案。現在我們來看看MSDN關于Silverlight運作環境的圖例:

WP7-Silverlight CoreCLR結構淺析

其實npctrl.dll就是Silverlight plug-in,這一點可以從安裝時的系統資料庫監控中找到答案:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InternetExplorer\ActiveX Compatibility\{32C73088-76AE-40F7-AC40-81F62CB2C1DA} 
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{DFEAF541-F3E1-4c24-ACAC-99C30715084A} 
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{DFEAF541-F3E1-4c24-ACAC-99C30715084A}\InprocServer32 
      

其鍵值是: C:\Program Files\Microsoft Silverlight\<版本号>\npctrl.dll

npctrl.dll本身是個 ActiveX控件與宿主浏覽器互動,而npctrl.dll會調用agcore.dll來處理一些非托管的API, 它具有NP_GetEntryPoints、NP_Initialize、DllGetClassObject、InstallOfflineApp、RemoveOfflineApp等調用函數。npctrl.dll會調用agcore.dll來進行繪制,以及coreclr.dll來建立CLR,Silverlight應用程式就是依賴于這個CLR中而被運作的。

agcore.dll與coreclr.dll共同構成了圖中的Core Services,agcore.dll是Silverlight的核心展現部件Core presentation framework包括了XAML parser, UI Core, Inputs, DRM(digital rights management), Media, Deep Zoom等,多數是需直接與具體的作業系統API打交道的功能。coreclr.dll是用來建立并執行Silverlight托管代碼的總控程式,圖中的CLR App Domain就是由coreclr.dll來建立,App Domain應用程式域是介于CLR程序與線程之間的邏輯概念,在一個應用程式域中可以共享全局資料,如下圖所示:

WP7-Silverlight CoreCLR結構淺析

而coreclr.dll負責各Silverlight應用程式的記憶體管理(包括自動記憶體管理、垃圾回收等)、運作引擎(包括JIT編譯器、異常捕獲管理、安全管理、類型安全校驗等)。按照MSDN的Silverlight整體架構圖所示agcore.dll 所負責的展現核心部件presentation Core 與coreclr.dll所負責的CLR執行引擎(CLR Execution Engine)起到了Silverlight應用中極其重要的引擎作用。

WP7-Silverlight CoreCLR結構淺析

其餘動态連結庫作用如下:

  • mscorrc.dll:運作時資源集
  • mscordaccore.dll:外部資料通路支援庫,包括對跨程序的資料通路
  • Microsoft.VisualBasic.dll(托管程式集):VB運作庫支援
  • Silverlight.ConfigurationUI.dll:Silverlight右鍵中的配置界面程式集
  • mscordbi.dll(屬于Silverlight開發運作時):運作時環境Debug調試服務
  • dbgshim.dll(屬于Silverlight開發運作時):多CLR調試助手

注:以上兩個動态連結庫檔案是加載到Visual Studio中,作為Silverlight程式調試所用。

最後我們就來看看mscorlib.dll與System.*.dll,這兩類托管程式集檔案構成了Silverlight運作時的基礎類庫,通過Reflector我們可以了解到該基類庫的全貌:

WP7-Silverlight CoreCLR結構淺析

下面是對各個程式集檔案的分析:

Mscorlib.dll:CLR的核心基礎類庫,包含以下常用命名空間

命名空間 命名空間簡介
System 包含基本資料結構和基類,運作時管理及委托類,如Object 基類;String,Int,Double, DateTime,Array等基礎資料結構;Convert 類型轉換類;Math數學函數類;Random随機數生成類;Activator等用于通過建立執行個體的類;Type類型聲明類,用于反射;以及GC垃圾回收類等
System.Collections.Generic 包含定義泛型集合的接口和類,如Dictionary,List等
System.Collections.ObjectModel 包含可在可重用庫的對象模型中用作集合的類,如Collection<T>,ObservableCollection<T>,ReadOnlyCollection<T>
System.Globalization 包含定義區域性相關資訊的類,這些資訊包括語言、國家/地區、使用的月曆、日期、貨币和數字的格式模式以及字元串的排序順序
System.IO 包含檔案模式、檔案通路、檔案共享和類用于路徑操作和操作流的類及枚舉。如Directory,File,StreamReader,StreamWriter等類及FileAccess等枚舉
System.IO.IsolatedStorage 包含用于管理獨立存儲的類,在 Silverlight 中,所有 I/O 操作都被限制為獨立存儲,不使用作業系統的檔案系統,如IsolatedStorageFile
System.Reflection 包含擷取托管代碼中程式集、類、屬性、方法等的反射類,此類為運作時動态調用提供了可能,如Assembly,PropertyInfo ,MethodInfo等
System.Reflection.Emit 包含允許編譯器或工具發出中繼資料和 Microsoft 中間語言 (MSIL) 的類,該類可以向編譯器頂端堆棧寫入IL語言,可實作更加靈活的動态化支援,如ILGenerator,OpCodes等
System.Runtime.InteropServices 提供各種支援 COM 互操作及平台調用服務的 .NET Framework 基礎結構
System.Runtime.Serialization 包含可用于将對象序列化和反序列化的類,如DataContractSerializer,XmlObjectSerializer等
System.Security 提供公共語言運作時安全系統的基礎結構。包括Cryptography的加密類庫,支援AES、SHA1 及SHA256哈希函數等加密算法與X.509證書
System.Text 包含表示操作和格式化 String的類,如Encoder ,Decoder,StringBuilder
System.Threading 包含進行多線程程式設計的類,如Timer,WaitHandle,Thread,ThreadPool等

System.dll:主要是對Mscorlib.dll基類的擴充,包括Uri支援、元件模型、正則式等

命名空間 命名空間簡介
System 包含Uri相關類,如Uri,UriBuilder等
System.Collections.Generic 對Mscorlib.dll的擴充,增加LinkedList,Queue,Stack等
System.ComponentModel 提供用于實作元件和控件運作時和設計時行為的類,包括用于Xaml綁定及執行異步操作的類,如BackgroundWorker,AsyncOperation等
System.Text.RegularExpressions 包括正規表達式引擎的類,如Regex,Match等

System.Core.dll:主要擴充委托、Linq及動态語言等

命名空間 命名空間簡介
System 包含委托方法類,如帶返參的委托方法類Func與不帶返參的委托方法類Action,目前最多支援16個泛型參數;擴充了Lazy<T>的延遲泛型對象。
System.Linq 提供支援使用語言內建查詢 (LINQ) 進行查詢的類和接口,如Enumerable,Queryable
System.Linq.Expressions 包含LINQ的基礎表達式樹的類、接口和枚舉,與.Net4.0中的表達式樹完全一緻,提供申明式程式設計方式
System.Dynamic 提供支援動态語言運作時的類和接口,支援以dynamic聲明的動态變量

System.Net.dll:負責網絡通信的程式集

命名空間 命名空間簡介
System.Net 提供多種網絡協定的簡單程式設計接口,如WebRequest 和 WebResponse類封裝不同協定下異步通訊的差異,使開發者不必考慮各種不同協定的具體細節,而HttpWebRequest 和HttpWebResponse 是上述兩類的的 HTTP 特定實作;WebClient類提供了上下行資料的工具
System.Net.Sockets 提供Socket網絡協定的托管實作,在Windows下是Winsock接口的托管實作,而在Mac OS X上BSD UNIX Socket的托管實作

System.ServiceModel.dll:負責WCF分布式通信的程式集

命名空間 命名空間簡介
System.ServiceModel 提供WCF的程式設計接口,支援WebService調用等
System.ServiceModel.Channels 包含構造和修改用戶端用于與服務進行通信的消息時所需的類型、枚舉和接口、用于交換消息的通道的類型、用于構造這些通道的通道工廠,以及用于配置這些通道的綁定元素,如BufferManager,BodyWriter,Message等
System.ServiceModel.Syndication 包含構成 Silverlight 聯合對象模型的所有類,如RSS 2.0來回序列化類、Atom 1.0來回序列化類

System.ServiceModel.Web.dll:擴充了JSON序列化類

命名空間 命名空間簡介
System.Runtime.Serialization.Json 用于将對象序列化為 JavaScript 對象表示法 (JSON),并可用于從 JSON 反序列化對象,如DataContractJsonSerializer和JsonReaderWriterFactory類

System.Windows.dll:Silverlight控件類庫,與 Windows Presentation Foundation (WPF) 中存在的類相似

命名空間 命名空間簡介
MS.Internal(對外不可見) 包含Silverlight内部控制元件與枚舉,以内部密封類形式存在,如負責下載下傳的Downloader類,負責錯誤的Error類以及負責XAML資訊的XamlMemberInfo類等
System.Collections.ObjectModel 擴充了mscorlib.dll的集合類,使其可用于一般用于UI控件資料源綁定,如ObservableCollection<T>等
System.Collections.Specialized 包含用于集合類中的事件處理的專用類,提供資料更改通知
System.ComponentModel 擴充了System.dll的元件和控件運作時和設計時行為的類,專門負責資料更改通知
System.IO.IsolatedStorage 擴充了mscorlib.dll的獨立存儲操作類,加入IsolatedStorageSettings 類以提供一個在獨立存儲中存儲鍵/值對的 Dictionary<TKey, TValue>
System.Runtime.InteropServices.Automation 提供可與已注冊COM進行互動操作的類,如AutomationFactory類允許在OOB模式下建立COM元件,并與Silverlight程式實作互操作
System.Windows 包括了Silverlight UI控件及屬性的基礎類、結構及枚舉,如程式總架構Application類,程式集部件AssemblyPart類,控件基類DependencyObject、UIElement、FrameworkElement,樣式類Style與Setter,UI狀态管理類VisualStateManager、VisualState、VisualStateGroup,事件路由類RoutedEvent,消息控件MessageBox等
System.Windows.Automation 提供對 Silverlight UI 自動化用戶端的支援
System.Windows.Controls 包括Silverlight UI基礎控件,如Canvas 、Button、TreeView 、DataGrid、WebBrowser等近百種控件
System.Windows.Controls.Primitives 提供Silverlight UI基礎控件的局部供開發者控制,如ButtonBase、CalendarDayButton、ScrollBar等
System.Windows.Data 包含用于将屬性綁定到資料源的類,如Binding等
System.Windows.Documents 包含支援 Silverlight 中基本文檔對象的類,如TextElement、Italic、Bold、Run等
System.Windows.Ink 提供用于手寫筆互動的類,如Stroke等
System.Windows.Input 提供支援 Silverlight 用戶端輸入的類,如Cursor、Keyboard、FocusManager、TouchPoint(多點觸摸)、InputScope、MouseEventArgs等
System.Windows.Interop 為 Silverlight 插件的屬性提供托管代碼公開的類,這些屬性也存在于宿主浏覽器的 HTML DOM 中,可以被JavaScript通路,如SilverlightHost,Content等
System.Windows.Markup 提供對 XAML 處理的類,包括 XAML 讀取器XamlReader等
System.Windows.Media 提供內建富媒體的類,包括繪圖、文本和音頻/視訊内容等,如Brush、ImageBrush、VideoBrush 、Geometry、AudioCaptureDevice以及可視化樹助手類VisualTreeHelper等
System.Windows.Media.Animation 提供動畫支援的類,包括時間線、故事闆和關鍵幀等,如Storyboard,Timeline,SineEase(正弦緩動)等
System.Windows.Media.Effects 提供視覺效果的類,可用于将視覺效果應用到位圖圖像,如BlurEffect,DropShadowEffect,PixelShader等
System.Windows.Media.Imaging 提供圖像處理的類,如BitmapImage等
System.Windows.Media.Media3D 提供3D的類,支援 Silverlight 中矩陣/透視示範,如Matrix3D等
System.Windows.Messaging 提供支援在多個基于 Silverlight 的應用程式之間建立本地消息傳遞通道的類,如LocalMessageReceiver,LocalMessageSender等
System.Windows.Navigation 提供支援導航的類,如UriMapper,NavigationService等
System.Windows.Printing 提供列印服務的類,如PrintDocument等
System.Windows.Resources 提供對通過 Silverlight 應用程式模型檢索資源的支援類,如StreamResourceInfo
System.Windows.Shapes Silverlight基本形狀庫,如Line,Ellipse,Rectangle,同時還包括 Path 類,該類可以加載路徑資料,以便通過對象模型或内聯格式描述複合幾何圖形
System.Windows.Threading 提供支援 Silverlight 線程處理系統的類,但隻包括Dispatcher方式的多線程類,如Dispatcher和DispatcherTimer

System.Windows.Browser.dll:與宿主浏覽器的互動程式集

命名空間 命名空間簡介
System.Windows.Browser 提供用于在基于 Silverlight 的應用程式中的托管代碼與 JavaScript 之間實作互動的類,此功能也稱為“HTML 橋”,如BrowserInformation ,HtmlDocument,HtmlElement,ScriptObject等

System.Xml.dll:處理 XML操作的程式集

命名空間 命名空間簡介
System.Xml 提供基于XML标準處理的類,如XmlReader、XmlWriter、XmlConvert、XmlDictionary等
System.Xml.Schema 包含為 XML 架構定義語言 (XSD)提供支援的類,如XmlSchema等
System.Xml.Serialization 包含用于将對象序列化為 XML 格式的文檔或流的類,如XmlSerializer,XmlRootAttribute等

至此,我們已經對Silverlight運作環境中所有的類進行了分析,但在實際應用中我們還可以通過對Silverlight工具或第三方工具程式集的引用來擴充應用架構,進而使前端程式具有更加強大的展現與處理能力。在開發環境中,我們還可以引用C:\Program Files\Microsoft SDKs\Silverlight\v4.0\Libraries檔案夾下的SDK程式集,譬如System.Json,System.Xml.Linq等。如果我們使用Silverlight ToolKit工具包來擴充Silverlight架構,那麼我們将在C:\Program Files\Microsoft SDKs\Silverlight\v4.0\Toolkit檔案夾下找到對應的工具程式集檔案,如System.Windows.Controls.Toolkit.dll就提供了如WrapPanel 、DockPanel、DragDropTarget等UI控件擴充。

最後,我們來回顧一下Silverlight應用程式的啟動過程:

WP7-Silverlight CoreCLR結構淺析

當使用者浏覽某個帶有Silverlight的網頁時,浏覽器加載Silverlight Plug-in插件(npctrl.dll),npctrl.dll啟動Silverlight核心CLR服務(coreclr.dll、agcore.dll),同時浏覽器将下載下傳指定的xap檔案。coreclr.dll在浏覽器宿主程序中啟動一個AppDomain來容納Silverlight 的UI與工作線程,并調用agcore.dll繪制加載界面,待加載完成後執行個體化Application類,并通過啟動事件(Startup)的委托(預設為Application_Startup)對首頁面進行加載,至此用戶端就可以在浏覽器中看到Silverlight程式了。

以上就是筆者針對Silverlight CoreCLR結構進行的簡單分析,希望對正在實施或關注Silverlight項目的讀者能有所幫助。下一期我們将通過一個Demo了解一下Silverlight在多線程方面的性能優勢。

繼續閱讀