Silverlight开发:从编译到部署的全面指南
立即解锁
发布时间: 2025-08-13 03:15:48 阅读量: 10 订阅数: 36 

### Silverlight开发:从编译到部署的全面指南
#### 混合ASP.NET控件与Silverlight内容
在开发中,很多开发者会使用HTML测试页面,但有更高追求的ASP.NET开发者可能会用Silverlight为现有的ASP.NET页面增添新功能,比如实现由Silverlight驱动的广告内容、菜单系统以及嵌入式小程序(像计算器或游戏)。不过,在创建这类页面时,有一些问题需要考虑。
我们知道,所有ASP.NET代码都在Web服务器上运行。为了让服务器端代码运行,ASP.NET控件使用回发机制将当前页面发送回服务器。例如,当你点击一个ASP.NET按钮时就会触发这个过程。但问题是,当页面回发时,当前的Silverlight应用程序会结束。服务器端代码运行后,一个新的页面版本会被发送到浏览器,浏览器加载这个新页面,此时Silverlight应用程序会重新启动。这不仅会让用户回到起点,还会因为需要重新初始化Silverlight环境而花费额外的时间。
如果你想避免这种干扰,可以使用ASP.NET AJAX技术,其中UpdatePanel是一个特别有用的工具。基本的操作步骤如下:
1. 将通常会触发回发的控件以及它们所修改的其他控件包装到一个或多个UpdatePanel控件中。
2. 当用户点击按钮时,会向Web服务器发送一个异步请求,而不是完整的回发。
3. 当浏览器收到回复时,它会更新页面的相应部分,而不会干扰Silverlight内容。
#### Silverlight编译与部署
在了解了如何创建基本的Silverlight项目、添加带有元素和代码的页面并运行应用程序后,接下来深入探讨Silverlight是如何从XAML文件和源代码集合转变为一个基于浏览器的丰富应用程序的。
##### 编译Silverlight应用程序
当你编译一个Silverlight项目时,Visual Studio使用与完整.NET应用程序相同的vbc.exe编译器。但它引用了不同的程序集,并传入命令行参数nostdlib,这可以防止VB编译器使用标准库(即定义在mscorlib.dll中的.NET Framework核心部分)。也就是说,Silverlight应用程序可以像用标准VB编写的普通.NET应用程序一样编译,只是可使用的类库更有限。Silverlight编译模型有很多优点,比如易于部署,并且与普通JavaScript相比,性能有显著提升。
编译后的Silverlight程序集包含编译后的代码和应用程序中每个页面的XAML文档,这些文档作为资源嵌入到程序集中,这样可以确保事件处理代码不会与所需的用户界面标记分离。需要注意的是,XAML不会以任何方式进行编译(这与WPF不同,WPF会将其转换为更优化的BAML格式)。
你的Silverlight项目会被编译成一个以项目名称命名的DLL文件。例如,如果你的项目名为SilverlightApplication1,vbc.exe编译器会创建SilverlightApplication1.dll文件。项目程序集会被存放到项目目录的Bin\Debug文件夹中,同时还会有其他一些重要文件:
- **PDB文件**:包含Visual Studio调试所需的信息,以项目程序集命名(如SilverlightApplication1.pdb)。
- **AppManifest.xaml**:列出程序集依赖项。
- **依赖程序集**:如果这些程序集的Copy Local属性设置为True,Bin\Debug文件夹中会包含Silverlight项目使用的程序集。Silverlight核心部分的程序集Copy Local属性设置为False,因为它们不需要与应用程序一起部署(你可以通过在解决方案资源管理器中展开References节点,选择程序集,然后使用属性窗口来更改Copy Local设置)。
- **TestPage.html**:这是用户启动Silverlight应用程序时请求的入口页面。Visual Studio仅为独立的Silverlight项目生成此文件,而不为ASP.NET托管的Silverlight项目生成。
- **XAP文件**:这是一个Silverlight包,包含部署Silverlight应用程序所需的一切,包括应用程序清单、项目程序集以及应用程序使用的任何其他程序集。如果你正在开发一个ASP.NET托管的Silverlight应用程序,Visual Studio还会将XAP文件复制到测试网站的ClientBin文件夹中。
当然,你可以使用Visual Studio项目属性更改程序集名称、默认命名空间(添加新代码文件时使用)和XAP文件名,只需在解决方案资源管理器中双击My Project节点即可。
##### 部署Silverlight应用程序
理解了Silverlight编译模型后,理解部署模型就很容易了。XAP文件是关键,它将应用程序的各个单元(应用程序清单和程序集)包装到一个简洁的容器中。
从技术上讲,XAP文件是一个ZIP存档。你可以通过将XAP文件(如SilverlightApplication1.xap)重命名为SilverlightApplication1.xap.zip来验证这一点,然后打开存档查看其中的文件。XAP文件系统有两个明显的好处:
- **压缩内容**:内容在到达客户端之前不会解压缩,这减少了下载应用程序所需的时间。如果你的应用程序包含大型静态资源(如图像或文本块),这一点尤为重要。
- **简化部署**:当你准备将Silverlight应用程序上线时,只需将XAP文件与包含Silverlight内容区域的TestPage.html或类似的HTML文件(或ASP.NET网页表单)一起复制到Web服务器即可,无需担心跟踪程序集和资源。
由于XAP模型,部署一个简单的Silverlight应用程序不需要考虑太多。托管Silverlight应用程序只需提供相应的XAP文件,以便客户端可以通过浏览器下载并在本地机器上运行。
不过,有一个潜在的问题需要注意。当托管Silverlight应用程序时,你的Web服务器必须配置为允许对XAP文件类型的请求。如果使用的是Windows Server 2008或带有Service Pack 1的Windows Vista,IIS 7默认包含此文件类型。如果你使用的是没有Service Pack 1的Windows Vista、早期版本的IIS或其他类型的Web服务器,则需要添加一个文件类型,将.xap扩展名映射到MIME类型application/x - silverlight - app。关于IIS的配置说明,请参考http://learn.iis.net/page.aspx/262/silverlight。
##### Silverlight反编译
在了解了支持Silverlight项目的基础设施后,就可以对任何现有的应用程序进行反编译以了解其工作原理,具体步骤如下:
1. 访问入口页面。
2. 查看网页的源代码,查找指向XAP文件的`<param>`元素。
3. 在浏览器的地址栏中输入对XAP文件的请求(保持相同的域名,但将页面名称替换为指向XAP文件的部分路径)。
4. 选择“另存为”将XAP文件保存到本地。
5. 将XAP文件重命名为添加.zip扩展名,然后打开它并提取项目程序集。这个程序集与你为普通.NET应用程序构建的程序集基本相同,包含中间语言(IL)代码。
6. 使用Reflector(http://www.red - gate.com/products/reflector)等工具打开项目程序集,查看IL和嵌入式资源。使用合适的插件,你甚至可以将IL反编译为VB语法。
当然,许多Silverlight开发者不赞成这种行为(就像许多.NET开发者不鼓励最终用户反编译他们的富客户端应用程序一样),但这是Silverlight编译模型不可避免的副作用。由于IL代码很容易被反编译或逆向工程,因此不适合存储机密信息(如加密密钥、专有算法等)。如果你需要执行使用敏感代码的任务,可以考虑从Silverlight应用程序调用Web服务。如果你只是想防止其他高手读取你的代码并模仿你的风格,可以使用混淆工具提高门槛,Visual Studio附带了一个名为Dotfuscator的简化混淆工具,市场上也有很多其他商业工具可供选择。
##### Silverlight核心程序集
Silverlight包含了完整.NET Framework的一部分类。虽然不可能将整个.NET Framework塞进Silverlight(毕竟它是一个5MB的下载包,需要支持各种浏览器和操作系统),但它仍然包含了大量的功能。
每个Silverlight项目一开始都会引用以下程序集,这些程序集都是Silverlight运行时的一部分,因此不需要与你的应用程序一起部署:
| 程序集名称 | 功能描述 |
| --- | --- |
| mscorlib.dll | 相当于包含.NET Framework最基本部分的mscorlib.dll程序集。Silverlight版本包含System命名空间中的核心数据类型、异常和接口;普通和泛型集合;文件管理类;以及对全球化、反射、资源、调试和多线程的支持。 |
| System.dll | 包含额外的泛型集合、处理URI的类以及处理正则表达式的类。 |
| System.Core.dll | 包含对LINQ的支持,程序集名称与完整的.NET Framework相匹配。 |
| System.Net.dll | 包含支持网络功能的类,允许你下载网页并创建基于套接字的连接。 |
| System.Windows.dll | 包含许多用于构建Silverlight用户界面的类,包括基本元素、形状和画笔、支持动画和数据绑定的类,以及一个适用于独立存储的OpenFileDialog版本。 |
| System.Windows.Browser.dll | 包含与HTML元素交互的类。 |
| System.Xml.dll | 包含XML处理所需的最基本类:XmlReader和XmlWriter。 |
需要注意的是,Silverlight程序集中的一些成员仅可供.NET Framework代码使用,不能从你的代码中调用,这些成员带有SecurityCritical属性。但这个属性不会在对象浏览器中显示,因此在尝试使用之前,你无法确定某个特定功能在Silverlight应用程序中是否可用。如果尝试使用带有SecurityCritical属性的成员,会抛出SecurityException。例如,Silverlight应用程序只能通过独立存储API或OpenFileDialog类访问文件系统,因此FileStream类的构造函数带有SecurityCritical属性。
##### Silverlight附加程序集
Silverlight的设计者致力于将核心框架保持尽可能小,这样可以使初始的Silverlight插件下载量小且安装速度快,这对所有的网页浏览者来说都是一个明显的卖点。
为了实现这个目标,Silverlight设计者将一些功能从核心Silverlight运行时中移除,并将其放在单独的附加程序集中。这些程序集仍然被视为Silverlight平台的一部分,但如果你想使用它们,就需要将它们与你的应用程序一起打包,这会增加应用程序的下载大小(不过Silverlight的内置压缩功能可以在一定程度上缓解这个问题)。
以下是一些最常用的附加程序集:
- **System.Windows.Controls.dll**:包含许多有价值但更专业的控件,如TreeView、TabControl、两个日期控件(DatePicker和Calendar)以及GridSplitter。
- **System.Windows.Controls.Data.dll**:有Silverlight从头构建的DataGrid,它是显示密集数据网格的理想工具,还有DataPager,它可以将结果拆分为可单独查看的组(称为页面)。
- **System.Windows.Controls.Data.Input.dll**:包含一些在构建数据绑定表单时有用的控件,如Label、DescriptionViewer和ValidationSummary。
- **System.Windows.Controls.Input.dll**:包括AutoCompleteBox,这是一个在用户输入时会下拉显示建议列表的文本框。
- **System.Windows.Controls.Navigation.dll**:包含构成Silverlight导航系统基础的Frame和Page控件。
所有这些程序集都会为你的Silverlight工具包添加新的控件。微软还通过Silverlight工具包提供了更多的附加控件,你可以从http://www.codeplex.com/Silverlight下载。
当你将一个来自附加程序集的控件添加到Silverlight页面时,Visual Studio会自动添加所需的程序集引用。如果你选择该引用并查看属性窗口,会发现Copy Local属性设置为True,这与构成核心Silverlight运行时的其他程序集不同。因此,当你编译应用程序时,该程序集会被嵌入到最终的包中。Visual Studio能够识别不属于核心Silverlight运行时的程序集,即使你手动添加它们,它也会自动将Copy Local设置为True。
##### 程序集缓存
程序集缓存是一种部署技术,允许你将依赖程序集从XAP文件中分离出来。你可以将依赖程序集与XAP文件一起部署,将它们放在同一文件夹的单独ZIP文件中,目的是通过让客户端保留常用程序集的缓存副本来减少应用程序的启动时间。
默认情况下,在Visual Studio中创建的Silverlight应用程序未配置为使用程序集缓存。要启用此功能,可以按照以下步骤操作:
1. 在解决方案资源管理器中双击My Project节点。
2. 在如图1 - 10所示的项目属性窗口中,开启“Reduce XAP size by using application library caching”设置。
3. 重新编译你的应用程序,点击解决方案资源管理器顶部的“显示所有文件”按钮,展开Bin\Debug文件夹,你会看到每个可缓存程序集对应的ZIP文件。例如,如果你的应用程序使用System.Windows.Controls.dll,你会在XAP文件旁边看到一个名为System.Windows.Controls.zip的文件,该文件包含System.Windows.Controls.dll程序集的压缩副本。在启用程序集缓存之前包含该程序集的XAP文件,现在将不再包含它。
如果你使用的是ASP.NET测试网站,Visual Studio会将XAP文件和所有可缓存程序集复制到网站的ClientBin文件夹中。
程序集缓存可以减小XAP文件的大小,较小的文件可以更快地下载,因此缩小XAP文件可以改善应用程序的启动时间。但最初,程序集缓存不会带来任何性能提升,因为客户端第一次运行Silverlight应用程序时,需要下载精简后的XAP文件和包含依赖程序集的单独ZIP文件,下载的数据总量是相同的。
不过,当用户第二次运行应用程序时,好处就会显现出来。浏览器会再次下载应用程序XAP文件,但由于依赖程序集仍在浏览器缓存中,客户端不需要再次下载它们。
为了充分利用程序集缓存,需要考虑以下几点:
- 下载的程序集的有效期与浏览器缓存相同。如果用户显式清除缓存,所有缓存的程序集都会被移除。
- 每次客户端运行应用程序时,应用程序都会检查缓存程序集的新版本。如果发现新版本,它会下载并替换之前缓存的版本。
- 如果一个应用程序下载了一个程序集并将其放在浏览器缓存中,另一个使用程序集缓存的应用程序可以使用它。
- 程序集缓存对于大型、不经常更改的程序集最有益。许多程序集并不大,每次应用程序启动时下载它们的成本并不高,在这种情况下,使用程序集缓存只会使应用程序的部署变得复杂。
- 通过一些工作,你可以将程序集缓存用于自己的类库程序集。同样,这在你的程序集很大且不经常更改时最有意义。
##### HTML入口页面
部署过程中的最后一个要素是HTML测试页面,它是进入Silverlight内容的入口点,即用户在Web浏览器中请求的页面。在独立的Silverlight项目中,Visual Studio将此文件命名为TestPage.html;在ASP.NET托管的Silverlight项目中,它会根据项目名称命名。无论哪种情况,你可能都想将其重命名为更合适的名称。
HTML测试页面实际上并不包含Silverlight标记或代码,它只是使用少量JavaScript为Silverlight插件设置内容区域(因此,禁用JavaScript的浏览器将无法看到Silverlight内容)。以下是一个简化后的HTML测试页面,保留了关键细节:
```html
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- saved from url=(0014)about:internet -->
<head>
<title>SilverlightApplication1</title>
<style type="text/css">
...
</style>
<script type="text/javascript">
...
</script>
</head>
<body>
<form id="form1" runat="server" style="height:100%">
<!-- Silverlight content will be displayed here. -->
<div id="silverlightControlHost">
<object data="data:application/x-silverlight-2,"
type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="SilverlightApplication1.xap" />
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="3.0.40624.0" />
<param name="autoUpgrade" value="true" />
<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0"
style="text-decoration:none">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181"
alt="Get Microsoft Silverlight" style="border-style:none"/>
</a>
</object>
<iframe id="_sl_historyFrame"
style="visibility:hidden;height:0px;width:0px;border:0px"></iframe>
</div>
</body>
</html>
```
关键的细节是表示Silverlight内容区域的`<div>`元素,它包含一个加载Silverlight插件的`<object>`元素。`<object>`元素包含四个关键属性,其中data和type属性不需要更改,它们表明`<object>`元素表示使用版本2或更高版本的Silverlight内容区域。但你可能想修改height和width属性,它们决定了Silverlight内容区域的尺寸。
需要注意的是,在修改HTML测试页面时要谨慎,一些看似微不足道的细节对于确保与某些浏览器的兼容性是必要的。例如,`<object>`元素中data属性末尾的逗号确保了Firefox的支持,Silverlight `<div>`底部的不可见`<iframe>`允许Safari进行导航。一般来说,你应该只更改测试页面的宽度和高度设置、参数列表以及替代内容。
##### 修改测试页面
如果你使用的是ASP.NET网站,测试页面在ASP.NET网站首次创建时生成一次,因此你可以修改HTML页面而不用担心更改会被覆盖。
如果你使用的是没有ASP.NET网站的独立项目,Visual Studio会在每次运行项目时生成测试页面,因此你对它所做的任何更改都会被丢弃。如果你想自定义测试页面,最简单的解决方案是为你的项目创建一个新的测试页面,具体步骤如下:
1. 至少运行一次你的项目以创建测试页面。
2. 点击解决方案资源管理器顶部的“显示所有文件”图标。
以上就是关于Silverlight开发从编译到部署的全面介绍,希望对你有所帮助。
### Silverlight开发:从编译到部署的全面指南
#### 总结与注意事项
在前面的内容中,我们详细探讨了Silverlight开发中从混合ASP.NET控件与Silverlight内容,到编译、部署、反编译,以及核心程序集、附加程序集、程序集缓存和HTML入口页面等多个方面的内容。下面通过一个流程图来总结整个Silverlight开发与部署的主要流程:
```mermaid
graph LR
A[创建Silverlight项目] --> B[编写代码与XAML]
B --> C[编译项目]
C --> D[生成DLL和XAP文件]
D --> E[部署应用程序]
E --> F[客户端下载XAP并运行]
G[混合ASP.NET与Silverlight] --> B
H[使用附加程序集] --> B
I[启用程序集缓存] --> E
J[修改HTML测试页面] --> E
```
在整个开发与部署过程中,还有一些额外的注意事项:
- **性能优化**:对于包含大量静态资源的应用程序,利用XAP文件的压缩特性可以显著减少下载时间。同时,合理使用程序集缓存对于大型、不经常更改的程序集能提高应用程序的启动性能。
- **兼容性问题**:在修改HTML测试页面时,要特别注意一些看似微小的细节,像`<object>`元素中data属性末尾的逗号和Silverlight `<div>`底部的不可见`<iframe>`,这些都是为了确保与特定浏览器的兼容性。
- **安全问题**:由于IL代码容易被反编译,不要在其中存储敏感信息。如果需要处理敏感代码,可以考虑调用Web服务,并使用混淆工具保护代码。
#### 常见问题解答
在Silverlight开发和部署过程中,开发者可能会遇到一些常见问题,下面为你解答:
**问题1:为什么我的Silverlight应用程序在页面回发时会重新启动?**
解答:这是因为ASP.NET控件的回发机制会将当前页面发送回服务器,服务器处理后返回新页面,导致Silverlight应用程序重新启动。可以使用ASP.NET AJAX的UpdatePanel控件来避免这种情况,将可能触发回发的控件和受影响的控件包装在UpdatePanel中,实现异步请求。
**问题2:如何确保我的Web服务器支持Silverlight应用程序的部署?**
解答:Web服务器需要配置为允许对XAP文件类型的请求。如果使用的是Windows Server 2008或带有Service Pack 1的Windows Vista,IIS 7默认支持。对于其他情况,需要添加一个文件类型,将.xap扩展名映射到MIME类型application/x - silverlight - app。具体的IIS配置说明可以参考http://learn.iis.net/page.aspx/262/silverlight。
**问题3:我可以在Silverlight应用程序中使用完整的.NET Framework类库吗?**
解答:不可以,Silverlight只包含了完整.NET Framework的一部分类。每个Silverlight项目引用的核心程序集是Silverlight运行时的一部分,功能相对有限。如果需要更多功能,可以使用附加程序集,但这些程序集需要与应用程序一起打包部署。
**问题4:程序集缓存真的能提高应用程序的性能吗?**
解答:程序集缓存可以减小XAP文件的大小,从而加快下载速度。但在首次运行应用程序时,客户端需要同时下载精简后的XAP文件和包含依赖程序集的单独ZIP文件,数据总量不变,不会有性能提升。当用户再次运行应用程序时,由于依赖程序集已在浏览器缓存中,无需再次下载,性能会得到改善。不过,对于小型、经常更改的程序集,使用程序集缓存可能会使部署变得复杂,收益不大。
#### 未来发展与趋势
虽然Silverlight曾经是一个流行的技术,但随着Web技术的不断发展,如HTML5、CSS3和JavaScript的强大功能逐渐增强,Silverlight的使用逐渐减少。不过,对于一些已经存在的Silverlight应用程序,仍然需要进行维护和优化。
未来,开发者可能会更多地转向使用现代的Web技术栈,以实现跨平台、高性能的Web应用程序。但Silverlight的一些技术理念和开发经验,如XAML的使用、程序集管理等,仍然可以为开发者提供有价值的参考。
同时,对于那些对安全性和性能有较高要求的企业级应用程序,Silverlight的一些特性,如程序集缓存和安全机制,仍然可以在一定程度上发挥作用。开发者可以根据具体的项目需求,综合考虑各种技术的优缺点,选择最合适的开发方案。
#### 结语
Silverlight开发涉及到多个方面的知识和技术,从编译到部署的每一个环节都需要开发者仔细考虑。通过本文的介绍,你应该对Silverlight开发有了更全面的了解,包括如何混合ASP.NET控件与Silverlight内容、编译和部署应用程序、处理程序集、使用HTML入口页面等。
在实际开发过程中,要根据项目的具体需求和特点,合理运用各种技术和工具,解决可能遇到的问题。同时,也要关注Web技术的发展趋势,不断学习和更新知识,以适应不断变化的开发环境。希望本文能对你的Silverlight开发之旅有所帮助。
0
0
复制全文
相关推荐










