使用VS2010创建一个Silverlight应用程序,程序的结构默认如下图:
Silverlight工程至少由两部分组成,一个是Silverlight应用程序(即图中的SilverlightApplication1项目),一个是承载Silverlight程序的页面(即图中的SilverlightApplication1.Web项目)。
SilverlightApplication1.Web项目中提供了两个页面,一个是aspx页面,一个是普通的html页面,对于承载Silverlight程序来说,他们没有什么不同,下面以html页面作为目标来解释Silverlight程序的加载过程。
打开html页面的源代码文件,可以看到如下代码:
<div id="silverlightControlHost">
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/SilverlightApplication1.xap"/>
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="4.0.50826.0" />
<param name="autoUpgrade" value="true" />
<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" style="text-decoration:none">
<img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="获取 Microsoft Silverlight" style="border-style:none"/>
</a>
</object>
SilverlightApplication1.Web项目中提供了两个页面,一个是aspx页面,一个是普通的html页面,对于承载Silverlight程序来说,他们没有什么不同,下面以html页面作为目标来解释Silverlight程序的加载过程。
打开html页面的源代码文件,可以看到如下代码:
<div id="silverlightControlHost">
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/SilverlightApplication1.xap"/>
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="4.0.50826.0" />
<param name="autoUpgrade" value="true" />
<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" style="text-decoration:none">
<img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="获取 Microsoft Silverlight" style="border-style:none"/>
</a>
</object>
<iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;0px;border:0px"></iframe>
</div>
承载页面检测到object标签后,会根据红字部分指示的路径下载SilverlightApplication1.xap包,该包是由Silverlight应用程序打包而成。xap包由开发环境自动打包生成,包含了Silverlight应用程序使用到的各种程序集还有资源。xap包本质上是一个zip格式的压缩包,我们可以使用标准解压缩软件把它解压。针对我们这个项目,xap包解压缩后包含AppManifest.xaml和SilverlightApplication1.dll两个文件,其中AppManifest.xaml文件非常重要,是每一个Silverlight项目都包含的,而dll文件则根据项目的不同而不同。
AppManifest.xaml文件是一份关于应用程序的基本描述文件,打开我们这个项目的AppManifest.xaml文件,可以看到如下结构:
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
EntryPointAssembly="SilverlightApplication1"
EntryPointType="SilverlightApplication1.App"
RuntimeVersion="4.0.50826.0">
<Deployment.Parts>
<AssemblyPart x:Name="SilverlightApplication1" Source="SilverlightApplication1.dll" />
</Deployment.Parts>
</Deployment>
如上,绿色标识的部分是程序集清单,标识改应用程序包含多少个程序集,如果有多个,则此处有多个<AssemblyPart>元素。红色部分是关于程序的入口点的说明,负责告诉Silverlight运行时从哪个程序集加载哪个类型来启动程序,此处的描述就是告诉运行时,在SilverlightApplication1.dll中加载SilverlightApplication1.App类型来启动程序。
让我们回过头来看SilverlightApplication1项目,里面包含App的类型定义:
public partial class App : Application
Application来自于System.Windows命名空间,负责Silverlight应用程序启动的一些工作。每一个Silverlight应用程序都需要有一个继承于Application类的子类来作为入口点,一般VS IDE默认帮我们建立的就是这个App类。如果我们在一个Silverlight项目创建了两个Application的子类会发生什么情况呢?此时需要在项目的属性中,对“启动对象”作一个设置,指定使用哪个子类作为入口点。开发环境在打包xap包时,会根据项目设定,在描述文件中写明是具体哪个子类作为入口点。
承载页面检测到object标签后,会根据红字部分指示的路径下载SilverlightApplication1.xap包,该包是由Silverlight应用程序打包而成。xap包由开发环境自动打包生成,包含了Silverlight应用程序使用到的各种程序集还有资源。xap包本质上是一个zip格式的压缩包,我们可以使用标准解压缩软件把它解压。针对我们这个项目,xap包解压缩后包含AppManifest.xaml和SilverlightApplication1.dll两个文件,其中AppManifest.xaml文件非常重要,是每一个Silverlight项目都包含的,而dll文件则根据项目的不同而不同。
AppManifest.xaml文件是一份关于应用程序的基本描述文件,打开我们这个项目的AppManifest.xaml文件,可以看到如下结构:
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
EntryPointAssembly="SilverlightApplication1"
EntryPointType="SilverlightApplication1.App"
RuntimeVersion="4.0.50826.0">
<Deployment.Parts>
<AssemblyPart x:Name="SilverlightApplication1" Source="SilverlightApplication1.dll" />
</Deployment.Parts>
</Deployment>
如上,绿色标识的部分是程序集清单,标识改应用程序包含多少个程序集,如果有多个,则此处有多个<AssemblyPart>元素。红色部分是关于程序的入口点的说明,负责告诉Silverlight运行时从哪个程序集加载哪个类型来启动程序,此处的描述就是告诉运行时,在SilverlightApplication1.dll中加载SilverlightApplication1.App类型来启动程序。
让我们回过头来看SilverlightApplication1项目,里面包含App的类型定义:
public partial class App : Application
Application来自于System.Windows命名空间,负责Silverlight应用程序启动的一些工作。每一个Silverlight应用程序都需要有一个继承于Application类的子类来作为入口点,一般VS IDE默认帮我们建立的就是这个App类。如果我们在一个Silverlight项目创建了两个Application的子类会发生什么情况呢?此时需要在项目的属性中,对“启动对象”作一个设置,指定使用哪个子类作为入口点。开发环境在打包xap包时,会根据项目设定,在描述文件中写明是具体哪个子类作为入口点。