Silverlight CoreCLR结构浅析

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

\

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

\

09e4c5f075c95d73f921f32601c4d605.jpg

\

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

\

a63ba7e5e59cd13ba4ec5a06d3351f12.jpg

\

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

\

8cd07c2178b5317b2017fdd332501954.jpg

\

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

\

c1cc02420fd6d7038803e2442cbddb7e.png

\

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

\

57924d9006a584b6b76a237faabbd280.png

\

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

\

cee2a9d90d96a85d9378f44f90cf6ed1.png

\

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

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

\

879936c6aaee9021b61674c4d46944dc.jpg

\

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

\

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

\

d58db9571f583e570669ef26866b4f7f.png

\

当用户浏览某个带有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中文站用户讨论组中与我们的编辑和其他读者朋友交流。

\\
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值