`
wyf
  • 浏览: 424980 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

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也自动为我们添加了这一行。

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

http://www.myext.cn/silverlight/30849.html

分享到:
评论

相关推荐

    silverlight 多种自定义弹出对话框

    silverlight 多种自定义弹出对话框, 1.解决多个弹出窗口时遮罩层重复问题,现在多个弹出窗口将共用一个遮罩层 2.解决多个弹出窗口中有一个窗口为模式对话框的情况下,关闭此模式对话框将不会取消模式遮罩层的问题 3...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    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 通过编程读写...

    ASP.NET4高级程序设计(第4版) 3/3

    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 ...

    Visual.Basic.2010.&.NET4.高级编程(第6版)-文字版.pdf

    1.2.1 控制台应用程序 10 1.2.2 从项目模板上创建项目 11 1.2.3 solution explorer窗口 13 1.2.4 项目属性 14 1.2.5 assembly information屏幕 15 1.2.6 编译设置 16 1.2.7 调试属性 20 1.2.8 引用 21 ...

    ASP.NET.4揭秘

    8.6 数据库驱动的web应用程序示例284 8.7 小结287 第9章 使用sqldatasource控件288 9.1 创建数据库连接289 9.1.1 连接到microsoft sql server289 9.1.2 连接到其他数据库292 9.1.3 在web配置文件中保存连接字符串293...

Global site tag (gtag.js) - Google Analytics