博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Silverlight自定义类库实现应用程序缓存
阅读量:4670 次
发布时间:2019-06-09

本文共 2246 字,大约阅读时间需要 7 分钟。

默认情况下,如果SL项目引用了一些其它程序集(即通俗意义上的dll文件),在编译打包时,这些dll会全部打包到一个xap文件里,随着引用的dll文件越来越多,xap文件会越来越大。

这还不是最严重的问题,如果确实需要使用这些dll,大就大吧,要用它容量肯定就会增加。但是如果多个SL项目都要引用相同的程序集时,这些dll会重复打包进每个xap文件,用户在加载多个xap时,实际上是重复下载了这部分dll文件,带宽使用率太低。

为了改善这种情况,SL引用了"应用程序库缓存"的概念,在vs2010的SL项目中,打开SL项目的属性页,会看到一个选项:“通过使用应用程序库缓存减少XAP大小(R)”

2011052409582960.png

勾上这个后,查看一下最终的ClientBin目录,会发现一些项目引用的其它程序集,已经分离出来变成了zip文件

2011052410002137.png

再稍微唠叨一下:上图中的MySLApp.xap在下载时,怎么知道会去加载System.Runtime.Serialization.Json.zip呢?

揭密:随便找个解压软件(比如WinRAR,WinZIP,7-ZIP之类),用它打开MySLApp.xap文件,把里面的AppManifest.xaml解压出来,用记事本打开,会看到类似以下内容:

这里的 <ExtensionPart Source="System.Xml.Serialization.zip" />就通知运行时加载同目录下的System.Xml.Serialization.zip,首次加载时会下载所有xap以及相关的zip文件,以后再次浏览页面时,如果缓存没有清空掉,zip文件将直接从缓存中读取,不会重复下载。

但是有一个问题,只有强命名的程序集可以这么做,如果是用户自己开发的类库,默认情况下就算你勾选了这个选项,最终还是会将dll一起打包进xap文件,如何也让自己开发的SL类库使用缓存呢?

步骤1:先为自己的SL类库程序集(使用强名称)签名

这一步可以借助vs2010完成,见下图

2011052410202867.png

然后重新编译

步骤2:创建xml映射文件

打开SL类库的编译输出目录(默认为bin\Debug目录),创建一个xml文件,文件名规则如下

比如类库输出的dll文件名为MyTools.dll,则这个xml文件必须是MyTools.extmap.xml,即 "dll文件主名+.extmap.xml"(且这个文件必须跟dll文件处于同一级目录),内容如下:

MyTools
1.0.0.0
c934ea1d360b6e15
MyTools.dll
解释一下:
name 为SL类库程序集的完整名称
version 指版本号(必须与AssemblyInfo.cs中的版本号一致)
publickeytoken 这个东东可以通过sn.exe工具查看(后面会讲到)
以上三项信息,必须与程序集的元数据一致
relpath 即为dll文件的物理文件名
downloadUri 这个一般把dll文件名扩展名改成.zip即可
publickeytoken的查看方法:
打开vs.net-->工具-->外部工具->添加
2011052410405360.png
标题输入 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
2011052410430495.png
在解决方案窗口上,选中SL类库项目,先编译通过,然后再选择"Get SN Token"菜单,就能看到对应的publickeytoken,如下图:
2011052410445435.png

步骤3:SL项目引用这个dll(或SL类库),并正确勾选"通过使用应用程序库缓存减少XAP大小(R)”即可

最终在ClientBin目录下,会看到类似下面的输出:

2011052410263262.png

可以看到VS已经自动将MyTools.dll打包成了zip文件,然后查看一下MySLApp.xap中的AppManifest.xaml内容

注意<ExtensionPart Source="MyTools.zip" />,vs也自动为我们添加了这一行。 

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

2011052714310184.png

示例源代码下载: 

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

转载于:https://www.cnblogs.com/yjmyzz/archive/2011/05/24/2055061.html

你可能感兴趣的文章
像电脑屏保一样的气泡碰撞效果
查看>>
python下使用epoll
查看>>
为什么要简化代码书写
查看>>
java大批量数据导入(MySQL)
查看>>
【D3】D3词汇表
查看>>
P1852 [国家集训队]跳跳棋
查看>>
初识指针
查看>>
mysql5.7安装
查看>>
mysql索引总结----mysql 索引类型以及创建
查看>>
linux环境变量设置和修改
查看>>
[Android]Notification汇总
查看>>
[COURSE_PTHE] 4. 枚举
查看>>
div设置overflow-scroll滚动之后,jq获取其子元素的offset.top出现问题。
查看>>
ReactNative项目xcode打包运行报错整理
查看>>
Django之数据表增删改查
查看>>
自动生成滚动条
查看>>
JS事件
查看>>
SSL 3.0曝出Poodle漏洞的解决方案-----开发者篇(转自:http://blog.csdn.net/lyq8479/article/details/40709175)...
查看>>
Personal Leetcode solution(Python) 1~20
查看>>
延时器弹窗
查看>>