转自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在多线程方面的性能优势