代码改变世界

Silverlight实现查询建模(三) XAP包的动态下载

2009-09-03 22:02  Amar-Yao  阅读(3277)  评论(7编辑  收藏  举报

 上一集说项目分层时提到了XAP包的动态下载。本篇文章主要讲述这个主题。
  1.
打包XAP
  
上集说到除了Framework层剩下的业务模块层的ClientPublic.SL项目都要在编译时打包成单独的XAP放在ClientBin下以备下载。这个操作通过脚本来完成。右键点击Web项目(XCenter.Web)属性。在生成事件页签我们加上以下脚本:

Code



  
上面的脚本都很简单,主要目的就是把要进行打包的DLLXML拷贝到ClientBin目录并用Chiron.exe这个文件进行打包后删除相应的拷贝。这里要说明的是Chiron.exeDLR中的一个XAP打包程序,需要的朋友可以去CodePlex上下载DLRAppManifest.xml是要打包的XAP的描述文件,拆开每个XAP包都会有这么一个清单文件。我们也会依据这个文件进行XAP包的装载。
   AppManifest.xml
文件内容如下:

清单文件Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  
<Deployment.Parts>
    
<AssemblyPart x:Name="Liquid.TreeView" Source="Liquid.TreeView.dll" />
    
<AssemblyPart x:Name="Liquid.Menu" Source="Liquid.Menu.dll" />
     
<AssemblyPart x:Name="Liquid" Source="Liquid.dll" />
    
<AssemblyPart x:Name="XCenter.QueryEngine.Public" Source="XCenter.QueryEngine.Public.dll" />
    
<AssemblyPart x:Name="XCenter.QueryEngine.Client" Source="XCenter.QueryEngine.Client.dll" />
    
</Deployment.Parts>
</Deployment>

   这里要说明一下清单中的文件XCenter.QueryEngine.Public就是项目中的XCenter.QueryEngine.Public.SL,命名空间和程序集名称相同而已。
   $(ProjectDir)Chiron.exe /d:$(ProjectDir)ClientBin"temp /x:$(ProjectDir)ClientBin"XCenterBusinessAttach.xap
就是打包XAP的命令。
   Chiron.exe
源目录 目标文件.xap ,打包后的效果见下图
  
   2.
动态下载XAP
  
动态下载XAP包的操作在应用启动时用WebClient进行。
  

Code


其中StorageService先检查是否需要下载缓存,也就是本地是否已经存在了要下载的XAP

Code


 下载的主要逻辑我封装在了Downloader类中

Code



  
代码都很简单,不用多说。主要实现的功能就是判断如果客户端的独立存储中如果没有指定的XAP包,那么就用WebClient进行下载。下载完毕分析XAP包中的AppManifest.xml文件,找出其中的DLL文件后用AssemblyPart装载进AppDomain
  
  
相关文件在这里 源代码