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
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
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
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 在多线程方面的性能优势。
感谢张凯峰对本文的策划及审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。
评论