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\\\u0026lt;版本号\u0026gt;\pctrl.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\u0026lt;T\u0026gt;,ObservableCollection\u0026lt;T\u0026gt;,ReadOnlyCollection\u0026lt;T\u0026gt; \ |
\ 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\u0026lt;T\u0026gt;的延迟泛型对象。 \ |
\ 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\u0026lt;T\u0026gt;等 \ |
\ System.Collections.Specialized \ | \ 包含用于集合类中的事件处理的专用类,提供数据更改通知 \ |
\ System.ComponentModel \ | \ 扩展了System.dll的组件和控件运行时和设计时行为的类,专门负责数据更改通知 \ |
\ System.IO.IsolatedStorage \ | \ 扩展了mscorlib.dll的独立存储操作类,加入IsolatedStorageSettings 类以提供一个在独立存储中存储键/值对的 Dictionary\u0026lt;TKey, TValue\u0026gt; \ |
\ 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在多线程方面的性能优势。
\感谢张凯峰对本文的策划及审校。
\给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家加入到InfoQ中文站用户讨论组中与我们的编辑和其他读者朋友交流。
\\\