默认情况下,如果SL项目引用了一些其它程序集(即通俗意义上的dll文件),在编译打包时,这些dll会全部打包到一个xap文件里,随着引用的dll文件越来越多,xap文件会越来越大。
这还不是最严重的问题,如果确实需要使用这些dll,大就大吧,要用它容量肯定就会增加。但是如果多个SL项目都要引用相同的程序集时,这些dll会重复打包进每个xap文件,用户在加载多个xap时,实际上是重复下载了这部分dll文件,带宽使用率太低。
为了改善这种情况,SL引用了"应用程序库缓存"的概念,在vs2010的SL项目中,打开SL项目的属性页,会看到一个选项:“通过使用应用程序库缓存减少XAP大小(R)”
勾上这个后,查看一下最终的ClientBin目录,会发现一些项目引用的其它程序集,已经分离出来变成了zip文件
再稍微唠叨一下:上图中的MySLApp.xap在下载时,怎么知道会去加载System.Runtime.Serialization.Json.zip呢?
揭密:随便找个解压软件(比如WinRAR,WinZIP,7-ZIP之类),用它打开MySLApp.xap文件,把里面的AppManifest.xaml解压出来,用记事本打开,会看到类似以下内容:
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="MySLApp" EntryPointType="MySLApp.App" RuntimeVersion="4.0.50826.0">
<Deployment.Parts>
<AssemblyPart x:Name="MySLApp" Source="MySLApp.dll" />
</Deployment.Parts>
<Deployment.ExternalParts>
<ExtensionPart Source="System.Runtime.Serialization.Json.zip" />
</Deployment.ExternalParts>
</Deployment>
这里的 <ExtensionPart
Source="System.Xml.Serialization.zip"
/>就通知运行时加载同目录下的System.Xml.Serialization.zip,首次加载时会下载所有xap以及相关的zip文件,下载浏览页面时,如果缓存没有清空掉,zip文件将直接从缓存中读取,不会重复下载。
但是有一个问题,只有强命名的程序集可以这么做,如果是用户自己开发的类库,默认情况下就算你勾选了这个选项,最终还是会将dll一起打包进xap文件,如何也让自己开发的SL类库使用缓存呢?
步骤1:先为自己的SL类库程序集(使用强名称)签名
这一步可以借助vs2010完成,见下图
然后重新编译
步骤2:创建xml映射文件
打开SL类库的编译输出目录(默认为bin\Debug目录),创建一个xml文件,文件名规则如下
比如类库输出的dll文件名为MyTools.dll,则这个xml文件必须是MyTools.extmap.xml,即 "dll文件主名+.extmap.xml"(且这个文件必须跟dll文件处于同一级目录),内容如下:
<?xml version="1.0"?>
<manifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<assembly>
<name>MyTools</name>
<version>1.0.0.0</version>
<publickeytoken>c934ea1d360b6e15</publickeytoken>
<relpath>MyTools.dll</relpath>
<extension downloadUri="MyTools.zip" />
</assembly>
</manifest>
解释一下:
name 为SL类库程序集的完整名称
version 指版本号(必须与AssemblyInfo.cs中的版本号一致)
publickeytoken 这个东东可以通过sn.exe工具查看(后面会讲到)
以上三项信息,必须与程序集的元数据一致
relpath 即为dll文件的物理文件名
downloadUri 这个一般把dll文件名扩展名改成.zip即可
publickeytoken的查看方法:
打开vs.net-->工具-->外部工具->添加
标题输入 Get SN Token(当然也可以改成你喜欢的名字)
命令输入 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0
Tools\sn.exe (即sn.exe的完整路径)
参数输入 -T $(TargetPath)
同时勾选"使用输出窗口"
完事之后,vs.net工具菜单下,应该会出一个菜单项 Get SN Token
在解决方案窗口上,选中SL类库项目,先编译通过,然后再选择"Get SN
Token"菜单,就能看到对应的publickeytoken,如下图:
步骤3:SL项目引用这个dll(或SL类库),并正确勾选"通过使用应用程序库缓存减少XAP大小(R)”即可
最终在ClientBin目录下,会看到类似下面的输出:
可以看到VS已经自动将MyTools.dll打包成了zip文件,然后查看一下MySLApp.xap中的AppManifest.xaml内容
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="MySLApp" EntryPointType="MySLApp.App" RuntimeVersion="4.0.50826.0">
<Deployment.Parts>
<AssemblyPart x:Name="MySLApp" Source="MySLApp.dll" />
</Deployment.Parts>
<Deployment.ExternalParts>
<ExtensionPart Source="MyTools.zip" />
<ExtensionPart Source="System.Runtime.Serialization.Json.zip" />
<ExtensionPart Source="System.Xml.Serialization.zip" />
</Deployment.ExternalParts>
</Deployment>
注意<ExtensionPart Source="MyTools.zip" />,vs也自动为我们添加了这一行。
示例源代码下载:http://files.cnblogs.com/yjmyzz/SL_App_Cache_Demo.7z
http://www.myext.cn/silverlight/30849.html
分享到:
相关推荐
silverlight 多种自定义弹出对话框, 1.解决多个弹出窗口时遮罩层重复问题,现在多个弹出窗口将共用一个遮罩层 2.解决多个弹出窗口中有一个窗口为模式对话框的情况下,关闭此模式对话框将不会取消模式遮罩层的问题 3...
5.2 global.asax应用程序文件 5.2.1 应用程序事件 5.2.2 演示应用程序事件 5.3 ASP.NET配置 5.3.1 machine.config文件 5.3.2 web.config文件 5.3.3 设置 5.3.4 5.3.5 5.3.6 5.3.7 通过编程读写...
在IT领域,Silverlight是一种由微软开发的富互联网应用程序(RIA)平台,它主要用于构建和部署可以在多种浏览器和操作系统上运行的交互式用户体验。在这个场景中,"最新的Silverlight图片轮显"指的是利用Silverlight...
2. **与ArcGIS的结合**:ArcGIS作为地理信息系统领域的领导者,通过提供Silverlight API,让开发者能够在Web环境中构建高性能的GIS应用,实现地图服务的高效访问和交互式地图展示等功能。 #### 二、ArcGIS ...
Silverlight是微软推出的一种富互联网应用程序(RIA)平台,主要用来创建和部署交互式的、媒体丰富的Web应用。在2007年首次发布后,Silverlight迅速被广泛应用于多媒体播放、数据可视化和交互式UI设计等多个领域。...
5.2 global.asax应用程序文件 140 5.2.1 应用程序事件 141 5.2.2 演示应用程序事件 143 5.3 ASP.NET配置 144 5.3.1 machine.config文件 144 5.3.2 web.config文件 147 5.3.3 设置 150 5.3.4 150 ...
RIA,即富互联网应用,是一种利用Web浏览器提供类似桌面应用程序体验的技术。通过结合HTML、CSS、JavaScript以及其他客户端技术(如Flash或Silverlight),RIA可以实现动态加载数据、实时更新界面等功能,从而为用户...
在这里,我们关注的是Silverlight版本,这是一种由微软开发的富客户端技术,用于构建具有动态交互性的网络应用程序。 在使用百度地图API下载公交信息之前,开发者需要在百度地图开放平台注册并申请API密钥。这个...
8. **GIS服务的应用**:最后,你将学习如何在Web应用程序、移动设备和桌面环境中使用ArcGIS Server服务,包括ArcGIS API for JavaScript、Flex和Silverlight的应用。 通过《ArcGIS Server .NET学习经典教程》,你...
培训内容覆盖从基础的ADF应用程序的建立、使用ADF控件、ADF编程,到图形数据源编程、ArcGIS Server数据源编程、创建自定义命令和工具、Web ADF任务框架、自定义任务创建、Geoprocessing以及扩展GIS服务器的各个方面...
它支持多种地图服务,包括谷歌地图、百度地图、腾讯地图和高德地图,使得开发者可以方便地在应用程序中添加地图显示、定位、路径规划等功能,而且它还支持离线地图的下载和使用。 一、GMap.NET概述 GMap.NET是基于...
.NET版本的ArcGIS Server为开发者提供了丰富的API和工具,使得利用C#、VB.NET等语言进行GIS应用程序的开发变得简便易行。本教程将引导你深入了解ArcGIS Server for .NET的基础知识和开发流程。 一、ArcGIS Server...
GMap.NET是一个开源的.NET框架,用于集成Google Maps、Bing Maps、OpenStreetMap等在线地图服务到Windows Forms、WPF、Silverlight和WP7应用中。改造版本可能意味着开发者根据实际项目需求对原始库进行了定制,比如...
Visifire支持多种图表类型,如折线图、柱状图、饼图、散点图等,可以轻松地与.NET应用程序集成,包括ASP.NET、WPF、Silverlight等平台。通过简单的API调用,我们可以创建、填充数据并更新图表。 对于实时更新的特性...