Silverlight自定义类库实现应用程序缓存

默认情况下,如果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也自动为我们添加了这一行。 

提示:如果您经过以上处理,vs.net仍然无法将程序集分离成zip包,请检查项目的引用中,该程序集的“复制本地”属性是否为false,如果不是,请更改为False

示例源代码下载:http://files.cnblogs.com/yjmyzz/SL_App_Cache_Demo.7z 

注:应用程序缓存不适用于OOB方式

时间: 2024-09-20 04:08:46

Silverlight自定义类库实现应用程序缓存的相关文章

为什么silverlight中的wcf引用不了自定义类库?

问题描述 为什么silverlight中的wcf引用不了自定义类库? 在silverlight中的WCF服务里面添加自定义的类库,出现"Unable to add reference to project '类库名'".请各位同仁赐教! 解决方案 这是很正常的,silverlight使用的是一个.net的精简版,并且运行在客户端,所以没办法调用完整的.net类库. 解决方案二: 您好!谢谢哦!那我要在WCF服务中引用我自定义的类该怎么办啊?因为之前是放在一个类库里面,想引用那个类库,结

HTML5应用程序缓存Application Cache详解

 什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. Application Cache带来的三个优势是: ① 离线浏览 ② 提升页面载入速度 ③ 降低服务器压力 而且主要浏览器皆以支持Application Cache,就算不支持也不会对程序造成什么影响 离线存储技术 HTML5提出了两大离线存储技术:localstorage与Application

php自定义加密与解密程序实例

 这篇文章主要介绍了php自定义加密与解密程序,实例分析了自定义加密解密类文件及相关用法,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php自定义加密与解密程序.分享给大家供大家参考.具体分析如下: PHP3 Cryption是一个非常容易被破解,不安全的加密功能,不应该是非常重要的东西用,虽然加密是好的,它不会阻碍对尖端开裂程序的严格考验. 不过,试试吧...这是一个伟大的方式来加密和解密字符串.与许多隐窝功能,这是双向的.基于一个密码,您可以加密或解密.您也可以解密或加

【原】HTML 5应用程序缓存使用总结

近期接触了HTML5本地缓存,在HTML页面的html标签加入后缀为.appcache的文件,即可以轻松地创建 web 应用的离线版本. 使用本地缓存带来的好处: 离线浏览 - 用户可在应用离线时使用它们 速度 - 已缓存资源加载得更快 减少服务器负载 - 浏览器将只从服务器下载更新过或更改过的资源. 浏览器支持: 所有主流浏览器均支持应用程序缓存,除了 IE HTML5 Cache Manifest 实例 下面的例子展示了带有 cache manifest 的 HTML 文档(供离线浏览):

HTML5应用程序缓存Application Cache

HTML5应用程序缓存Application Cache 什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. Application Cache带来的三个优势是: ① 离线浏览 ② 提升页面载入速度 ③ 降低服务器压力 而且主要浏览器皆以支持Application Cache,就算不支持也不会对程序造成什么影响 离线存储技术 HTML5提出了两大离线存

php自定义加密与解密程序实例_php技巧

本文实例讲述了php自定义加密与解密程序.分享给大家供大家参考.具体分析如下: PHP3 Cryption是一个非常容易被破解,不安全的加密功能,不应该是非常重要的东西用,虽然加密是好的,它不会阻碍对尖端开裂程序的严格考验. 不过,试试吧...这是一个伟大的方式来加密和解密字符串.与许多隐窝功能,这是双向的.基于一个密码,您可以加密或解密.您也可以解密或加密过无数次,通过循环或其他方法.字母表中的字符也是变化的.所有这些事情让你修改和巩固加密. 关于这最佳的部分?您可以加密与解密或一张纸和一支铅

HTML5应用程序缓存实现离线Web网页或应用

HTML5应用程序缓存和浏览器缓存的区别. (有些)浏览器会主动保存自己的缓存文件以加快网站加载速度.但是要实现浏览器缓存必须要满足一个前提,那就是网络必须要保持连接.如果网络没有连接,即使浏览器启用了对一个站点的缓存,依然无法打开这个站点.只会收到一条错误信息.而使用离线web应用,我们可以主动告诉浏览器应该从网站服务器中获取或缓存哪些文件,并且在网络离线状态下依然能够访问这个网站. 如何实现HTML5应用程序缓存. 实现HTML5应用程序缓存非常简单,只需三步,并且不需要任何API.只需要告

Php output buffering缓存及程序缓存深入解析_php技巧

下面测试ob缓存和程序缓存:在测试前为了测试效果更明显,我们在php.ini里先关闭ob缓存并设置明显的错误级别.Output_buffering=offDisplay_errors=on代码1: 复制代码 代码如下: echo "php";header("content-type:text/html;charset='utf-8'");echo 'ok'; 则会出现phpWarning: Cannot modify header information - hea

Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象

最近在一直研究Silverlight下的数据绑定控件,发现有这样两个接口IEditableObject 和IEditableCollectionView,记录一下结论,欢迎交流指正. 本文会重点介绍在构建Silverlight自定义数据绑定控件的过程中,我们会对数据源进行操作,那么就会碰到上述两个接口,如何正确的处理它们.   IEditableObject 这个概念早在.Net 1.0的时候就提出了,但是我一直没有关注过这个东东. What is IEditableObject? IEdita