WP7-Silverlight CoreCLR结构浅析
来源:互联网 发布:smap 知乎 编辑:程序博客网 时间:2024/05/16 09:02
转自:http://www.infoq.com/cn/articles/silverlight-coreclr
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在多线程方面的性能优势。
- WP7-Silverlight CoreCLR结构浅析
- Silverlight 中的 CoreCLR
- Silverlight 中的 CoreCLR
- TestDriven.NET (2.7 Beta) 支持Silverlight/CoreCLR
- Silverlight/WP7 MultiBinding
- Silverlight/WP7 MultiBinding
- windows phone:Silverlight/WP7 MultiBinding
- Silverlight结构
- Silverlight 结构
- Silverlight/WPF/WP7一周学习导读
- Silverlight/WPF/WP7一周学习导读
- Silverlight/WPF/WP7一周学习导读
- Silverlight/WPF/WP7一周学习导读
- Silverlight/WPF/WP7一周学习导读
- Silverlight/WPF/WP7一周学习导读
- Silverlight/WPF/WP7一周学习导读
- Silverlight/WPF/WP7一周学习导读
- Silverlight/WPF/WP7一周学习导读
- [置顶]铁道部购票网站可能造成另一次的密码危机
- 网上订火车票的方法(Firefox+Firebug)
- extjs自定义事件
- 中国企业家:淘宝的艰难新生
- “今夜酒店特价”的商业模式是什么?
- WP7-Silverlight CoreCLR结构浅析
- Js跑马灯效果
- PHP session回收机制
- 新年开工缺少气氛
- 图像处理中的傅立叶变换(闲扯版)
- 互联网公司是怎样激发你的消费欲望的?
- WP7-Expression Blend 设计wp7应用程序用户界面
- SqlParameter类——带参数的SQL语句
- 动态域名解析服务系统简介