转自InfoQ,作者:吴磊

Silverlight背后有强大的.Net平台支持,自Silverlight1.1开始它就使用CLR运行时环境,而Silverlight4更是将运行时环境升级为最新的.Net4.0版本。下面我们就来看看Silverlight CoreCLR里面究竟有什么?

 

我通过解压Silverlight安装程序了解其.Net的身份与丰富的基础类库。下图是笔者解压Silverlight4安装程序后的文件列表截图:

 

 

其中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类库的精简情况:

 

 

Silverlight安装文件夹下npctrl.dll为浏览器插件,为宿主浏览器提供了Silverlight的插件式集成,同时也避免了 JavaScript等对不同浏览器的兼容问题。如果使用depends工具查看Silverlight安装文件夹下的npctrl.dll、 coreclr.dll、agcore.dll的话,我们可以发现它们没有通过.Net总入口MSCOREE.DLL程序集启动,它们并不是 Silverlight的.Net基础类库:

 

 

如上图所示,这些动态链接库并不是托管程序,而是引用Windows的内核与API的底层接口,是负责与操作系统交互的核心运行文件。现在我们来看看MSDN关于Silverlight运行环境的图例:

 

 

其实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进程与线程之间的逻辑概念,在一个应用程序域中可以共享全局数据,如下图所示:

 

 

而coreclr.dll负责各Silverlight应用程序的内存管理(包括自动内存管理、垃圾回收等)、运行引擎(包括JIT编译器、异常捕获管理、安全管理、类型安全校验等)。按照MSDN的Silverlight整体架构图所示agcore.dll 所负责的展现核心部件presentation Core 与coreclr.dll所负责的CLR执行引擎(CLR Execution Engine)起到了Silverlight应用中极其重要的引擎作用。

 

 

其余动态链接库作用如下:

 

  • 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我们可以了解到该基类库的全貌:

 

 

下面是对各个程序集文件的分析:

 

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应用程序的启动过程:

 

 

当用户浏览某个带有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在多线程方面的性能优势