Silverlight运行原理 解析综合版(一)
2011-10-09 19:12 沐海 阅读(3863) 评论(2) 编辑 收藏 举报Silverlight运行原理
Silverlight通过什么方式和服务器端的托管代码进行交互。
Silverlight也许是把托管dll下载到本地执行。
用工具跟踪http请求后,果然如此。
1. IE加载页面后。IE缓存中加载了 HTML页面、Silverlight.JS、XAP应用程序包。
2.FF调试网络通信发现。先加载HTML页面-- Silverlight.JS---得到一个LInkID--- XAP应用程序包—安装Silverlight的图片
-得到一个LInkID,其实也是下面那个图片。PNG也是那个图片
原来Silverlight按xaml里指定的类库名,下载相应的 .dll和 .pdb文件(他们结合在一起是一个 XAP应用程序文件包)到客户端,在本地环境加载后执行。
这样看来,下载完所有库后,Silverlight运行原理就和Winform是一样的了。
同样的原因,Silverlight项目编译的文件都放在ClientBin 的目录下,就是说这个目录的文件都是要下载到客户端运行的。用于支持Silverlight的运行。
那么为什么应用程序已经下载下来了。却还是可以在断点调试啊。这个和ASP.NET的原理是一样的。IIS的虚拟目录指向的就是你的VS中的项目目录。而VS中的调试是针对于IIS的请求的处理。 Silverlight3.0 JS代码和后台调试的关系是后台代码可调试,而JS不可调试。是因为下面写了
Silverlight调试 指的是什么
VS为什么可以响应JS调试:调试前的设置你会发现。JS调试必须先把浏览器的禁用调试设置不选。这证明其实JS的调试虽然是通过VS来运行的。可VS在调试JS中时的作用和FireBUG一样的。都是针对浏览器调试的。而为什么有人说调试JS时,后台就没办法调试。JS调试针对是浏览器的。后台调试是针对IIS的请求的。所以这样时他们是没有冲突的。
测试前注意:IE开禁用脚本调试
不选择 Silverlight调试时。XAML的后台断点被忽略。JS和后台代码都可以调试。
当开Silverlight调试时,JS代码的VS调试器提示不能用。因为他开一个用于检测Silverlight了。所以说JS调试和Silverlight冲突。
结构:
Ø Silverlight 项目文件结构
一个标准的Silverlight项目一般包括如下几个部分:
² Web页面:用于嵌入或是宿主基于Silverlight的应用程序。
在<head>部分包含了两个独立的javascript文件,这两个javascript脚本分别用于创建silverlight和检查本地是否安装silverlight插件。
一个<div>中包含Silverlight,它由<Head>中的<Style>定义一个样式,而<div>里面是一行简单的Javascript函数调用创建silverlight。这个函数在前面包含的单独javascript文件中。
² Javascript文件
Silverlight.js:辅助创建Silverlight插件的文件, 其中定义了创建Silverlight的CreatObject和CreatObjectEx方法,定义了Silverlight版本检查代码和实例化Silverlight插件的代码。
TestPage.HTML.js:调用Silverlight.js中的CreatSilverlight方法创建Silverlight插件。
负责使用silverlight专属的对象提取一个XAML文件,并把这个XAML转换成Silverlight。
² XAML文件:用于定义Silverlight应用程序的用户界面元素
如同Flash的SWF文件一样,不过SWF文件既包括资源又包括逻辑,并且是不可读的,而XAML只包括资源和表现形式,不包括程序逻辑,并且是可读的。
每一个XAML文件都对应一个相同文件名+".cs"或者".vb"的服务器端代码,和ASPX的CodeBeside很相似。
² Silverlight插件:用于输出Silverlight内容,它使用HTML的<Object>或<Embed>标签嵌入HTML
Ø Silverlight 工作原理
A. 从浏览器发出HTTP请求,服务器接到后返回HTML、Javascript
B. Javascript首先检查是否安装了Silverlight插件,如果没有则提供下载
C. Javascript开始创建Silverlight,并从服务器下载XAML文件
D. Silverlight的Javascript检查到XAML文件后,根据需要向服务器请求程序逻辑(不管后台是cs的源代码还是编译好的,程序逻辑始终是后台负责编译并执行的,然后把执行结果透过XML传递给前台)。由于请求和响应的内容很短,是类似Ajax的,所以如果网络带宽够用的话应该不会很卡。
E. 本地Javascript接到响应后根据响应结果显示效果
注意:上面只是创建。如果是运行 请参见 运行原理。
Ø Silverlight与ASP.NET / Ajax.Net
我们刚才有提到Silverlight整合既有的网页技术,这也包含了ASP.NET与Ajax.NET,因此就设计上可以补强二者关系,若以深入来谈 Silverlight可以与任何的Ajax程式来沟通,包含前端与后端(Client & Server side),所以ASP.NET与Ajax.Net能用来控制Silverlight为基底的视觉化资料,来表现出丰富的使用者介面,举例来说,您可以在 Silverlight指向到另支一支程式,或是用依据程式需求来播放一个影片。
部署Silverlight到产品Web服务器是一个相当容易的过程,尽管有时候会有一些错觉——譬如,认为Silverlight需要部署在基于微软的Web服务器(IIS)上, Silverlight不强制一定部署在基于微软的Web服务器上,Apache也可以像IIS一样,轻松愉快的支持Silverlight运行。Web服务器通常都只支持有限种已知扩展名的静态文件内容,Silverlight引入了两个新的文件扩展,因此,你需要为web服务器添加MIME类型,这样才能让Web服务器识别并处理那些类型的文件。
Ø Silverlight与Adobe Flash
Silverlight与Flash有着不同的技术基础:Flash使用“半公开”的二进制格式而Silverlight基于声明性编程方式WPF。
为了清楚的展示Microsoft®与®在RIA的展示层、语言、工具架构上的不同,有两者架构比较图如下:
Silverlight 全系列 – Hello word application
如果你已经配置好了你的开发环境,如果没有你可以参考 Silverlight 全系列 - 开始。
简 要
1.我会在这里将同一个例子用两个开发环境完成:Vs2008 和 Microfot Expression Blend 3。
2.解释一个典型的Silverlight项目的文件结构和构成。
3.简单解释一个Silverlight项目如何运行的。
4.完成HellowWorld Application。
5.MainPage.xaml 和 MailPage.xaml.cs关系。
Microsft Expression Blend 3 :是一个华丽的可视化的开发环境,主要利用它来做界面布局和美工相关的工作,当然其实它的功能远远不止这一点点。
开始使用vs2008建立HelloWorld
1.开启Vs2008新建一个项目:文件>>新建项目.
2. 在“新建项目”对话框中选择:C# >> Silverlight Application. 为项目取名为:Helloworld
3.点击确定,然后可以看见如下的对话框:
因为Silverlight需要本质上运行在一个插件环境中,所以它需要一个宿主来承载它。这个界面就是在询问你是否需要同时建立一个Web Application来承载Silverlight Application。当然如果你只是独立的开发Silverlight Application那么也可以不用将Host the Silverlight Application in a new Web site前的勾勾去掉。如果是这样,那么你的Silverlight Application会在你需要调试的时候帮你生成一个html的用于测试的页面来承载你的Silverlight.
程序文件结构
如果你直接点击“OK”(确定)就得到如下的显示的内容:
一旦你完成,你就可以Solution里面的为你创建的文件结构。有必要做一个简单的介绍,一般了解Silverlight开发环境都有些什么构成
首先你会看见一个HelloWorld project. 这是一个“Silverlight Application” 类型的项目。Silverlight 无法使用传统的.net framework平台的类库,它有属于自己的开发平台。
在Silverlight Application 项目中,你可以看见被我标识的A,B.其中:
A:是必要的,当Silverlight被启动是首先会执行这个它。它是继承Application类而来的一个特定的App对象,主要帮你完成应用程序的初始化的工作和启动应用程序,就是我们知道“程序入口”。
B:默认情况下,你会看见一个MainPage.xaml 和 mainPage.xaml.cs文件,它是继承UserControl类而来的。默认情况下App会载入这个界面。
应用程序包必须包含一个程序集,该程序集具有从 Application 派生的类。Application 类封装您的应用程序和 Silverlight 插件之间的交互。例如,它允许您在宿主网页内显示用户界面。此外,它提供应用程序生存期事件和资源管理。
然后是另一个项目位于Silverlight Application 项目的下面。那是一个传统的Web Application的项目。在这个项目下我标识了C。
C:是自动产生并用于承载Silverlight应用程序的,你可以设置任意其中的一个为起始页面。
ClientBin: 你还可以看见一个ClientBin文件夹,Silverlight生成的下载程序包(.xap)就保存在这里。一旦你将项目生成你将在里面看到Helloworld.xap程序包。
文件结构就解释到这里。
程序运行原理
1.一旦你完成了Silverlight程序,它会生成一个.xap程序包并把这个文件包放入到ClientBin文件下。但在复杂的情况下,你不仅可以看到.xap程序包,还会看到一些.zip的压缩文件也反正这里。这些文件包和压缩包将被下载到客户端。
2.当用户请求承载Silverlight的页面如HelloworldTest.aspx页面的时候,程序包首先会被下载。
3.一旦程序包下载完成,Silverlight的运行时会加载Silverlight应用程序到应用程序域中。
4.然后,App.cs会先执行,它会加载Mainpage.xaml并将其显示出来。
应用程序域:也许很多人对这个概念不是很熟悉,你可以暂时认为它是一个专门运行程序的特定区域。就像人只能生活在地球上一样,但如果你想到月球去也可以,请穿上太空服。这里的应用程序域有点类似于太空服。
其实很犹豫是否应该讲讲Silverlight的体系结构。一般很多人是不很愿意去看这些理论的东西。不过我想了解一下应该对你的认识和熟悉Silverlight是很有帮助的。虽然在看的时候,也许你会存有疑惑,不过我想我应该会在后面慢慢将其揭开。所以还是决定讲讲。
概 要
· 什么是Silverlight?
· Silverlight和.net framework的关系
· 简单了解Silverlight平台
什么是Silverlight
· 类似Flash的效果在网页中,只是Silverlight很好的和服务器通讯,可以利用Silverlight提供更好的界面体验同时强于Flash。
· 它是一个典型的运行在“沙箱”中的程序,也就是说它只能有限的访问客户端机器上的资源,但可以提供很好用户体验。
· 如果要比较只能把它和Flex技术进行比较。为了理解方便我才在前面提及到Flash。
以上表明了一点,如果我们想运行Silverlight就必须安装它的“插件”,就是 Microsoft Silverlight 3 Developer Runtime。
当你安装Silverlight SDK 或 Silverlight Tools 3.0 software for VS2008的时候它就会被安装。只有安装了Runtime才能运行Silverlight的应用程序。这个Runtime的安装包中包含:
1.承载Silverlight应用的程序的插件。
2.支持运行程序的基础架构。
Silverlight 和.net framework的关系
严格意义上,Silverlight是.net frameworkd的子集。Silverlight拥有自己的一套framework,被称为 .net framewor for Silverlight。
虽然这个framework看上去类似于.net framework的架构体系,但实际上他们是不一样的。.net framework for Silverlight 是全新的,但受.net framework 的支持。如果你的机器并没有安装.net framework 包也一样可以运行Silverlight,只要你安装了Microsoft Silverlight 3 Developer Runtime。以下几点要注意:
· 如果你建立一个基于.net framework的项目,在项目中你可以应用Silverlight的相关程序集包括SDK和runtime。
· 如果你建立了一个Silverlight的应用程序或类库项目,那么你想在其中引用.net framework中的程序集是不可能的。因为在Silverlight的范围内是不支持.net framework的。
也就是说,对于.net framework而言,它能支持Silverlight,但对于Silverlight而言它是不支持面向.net framework的开发的。这也就意味着如果你在开发Silverlight的应用程序的话,那么你原有的基于.net framework的东西是无法直接使用的。但在vs2008中可以调整一个类库项目的属性转变当前的.net framework的项目为一个.net framework for Silverlight的项目。
设置步骤:选中项目文件>右击>点击属性>在属性的“应用程序”中>> 勾选“仅使用客户端框架字集”
现在我们其实面对了两个.net framework, 一个是传统的一个是面向Silverlight. 虽然他们使用不同的框架在开发,但他们两者有高度的相似度,几乎原来定义在.net framework上基础类在Silverlight的框架中都原封不动的保留下来,包括类的名称,用法等。这样做有一个好,我们只需要引用不同框架下的相应程序集就可以实现从.net framekwork到Silverlight的转变。
简单了解Silverlight平台
在开始了解Silverlight平台前,请看看先前章节中提到的xap包。你可以将Hello word application(也许你完成了,如果没有你可以建立一个新的,直接编译就可以了)项目中位于ClientBin文件夹下的HelloWorld.xap复制到任何一个地方,将其后缀名由xap改成zip.然后用工具打开看看所谓的程序包里到底装了写什么东西。如果你做的程序足够简单你会看到两个文件
AppManifest.xaml 和 HelloWorld.dll文件,这些文件会被下载到客户端,然后被客户端runtime运行。
这里经历了几个步骤:
· 获得请求后,Silverlight的xap包及相关的资源会被下载到本地(这个过程是由Silverlight插件触发的)。
· 在客户端,一旦程序包下载完毕就会将其载入到程序域中执行。
也就是说,Silverlight的平台是运行在客户端的,并不是像asp.net那样运行在服务器端的。对于Silverlight平台而言,它是由核心表现层框架、.NET Framework for Silverlight 和一个安装程序和更新组件组成。
如果他运行在客户端平台。那么为什么可以在服务端进行调试那?因为当你在属性—Silverlight调试 选中时。就代表。支持客户端的调试。类似Firebug。所以JS调试就禁用了。
而且。TOOL集成了运行时(浏览器上的运行环境)。所以可以直接在Silverlight中和运行时进行通信。实现断点调试。
组件 |
说明 |
核心表示层框架 |
面向 UI 和用户交互的组件和服务(包括用户输入、用于 Web 应用程序的轻量型 UI 控件、媒体播放、数字版权管理和数据绑定)以及表示层功能(包括矢量图形、文本、动画和图像)。此外还包括用于指定布局的可扩展应用程序标记语言 (XAML)。 |
.NET Framework for Silverlight |
.NET Framework 中包含组件和库的一个子集,其中包括数据集成、可扩展 Windows 控件、网络、基类库、垃圾回收和公共语言运行时 (CLR)。 .NET Framework for Silverlight 的某些部分是通过应用程序部署的。这些"Silverlight 库"是未包括在 Silverlight 运行时中但将在 Silverlight SDK 中提供的程序集。在应用程序中使用 Silverlight 库时,它们会与应用程序打包在一起,并下载到浏览器中。这些库包括新的 UI 控件、XLINQ、整合 (RSS/Atom)、XML 序列化和动态语言运行时 (DLR)。 |
安装程序和更新程序 |
是一个安装和更新控件,可简化用户首次安装该应用程序的过程,以后可提供低影响自动更新。 |
我不想从Silverlight Documentation 中copy这个到这里,但怎么能不说明呢?虽然不上面的解释有些不适让人很好理解,然后总比没有一个标准的基础上再做解释来的好的。
同时我还要copy一幅说明它们的图到这里,不过在做后我会对这一切都一个明白的解释。所以希望你能看完。
你可以看到我把上面分割成了三个部分。
C:表示支持Silverlight 的安装和更新的组件。也可以说C就是我们所说的插件,但不完全是。
集成网络协议栈:要通过网络通信就需要它。
DOM 集成:要和浏览器良好沟通就需要它,Silverlight是不可能不和浏览器打交道的。
应用程序服务:提供如果启动、装载和维持应用程序的必要服务,没有它Silverlight就无法运行。
安装程序:随着技术升级,相应的Microsoft Silverlight Developer Runtime也会不断更新。它提供了一种智能更新必要组件的方式。
B:这个部分主要处理图形、呈现、媒体处理及接收输入等方面的处理,它主要和操作系统以及硬件方面的支持打交道。没有它Silverlight是无法帮你提供多样化的视觉听觉及媒体处理方面的效果的。
B和A之间你可以看见是XAML,你可以通过XAML的定义直接访问B中提供的支持(原来传统的概念中,如果我们要去获得类似的支持只能通过.net framework提供的API在访问。但现在你不仅仅可以通过API来用编程的方式来访问还可以通过XAML定义的方式来访问。也就是说在这里你有了两套API可以使用来达到相同的目的。当然XAML不仅仅是只能访问B中的功能而已。几乎是你能用代码实现的用XAML也可以实现。这是很有趣的一点。
A: 是.net framework for Silverlight 我们觉得比较熟悉的一个部分,它类似于.net framework的体系结构甚至类的名称几乎都是一样的,虽然它是全新的相对于.net framework而言。这里我就不多解释了。
在A的右边灰色的区域并不属于.net framework for silverlight的一部分,它是为了支持能够在浏览器中通过脚本的方式来开发Silverlight而设计的。