SilverLight 缓存辅助——extmap生成工具emGen
关于收集到的XAP缓存的资料,没有一一列转载,如果您是作者,感到不满,请通知我移除。
Silverlight 2应用程序中XAP文件揭秘 如何减小XAP文件的大小 silverlight 使用應用程式庫快取,以減少 XAP 大小
Silverlight自定义类库实现应用程序缓存 完美实现Silverlight动态加载(XAP动态加载) 阻止xap文件在浏览器中缓存
Silverlight:xap包(或本地缓存)下载版本更新的解决思路 如何削减silverlight XAP包的尺寸 Silverlight 动态加载XAP文件
silverlight自定义程序集缓存 快速浏览silverlight3 Beta: 打包下载文件(共享程序集) 分包下载及SEO优化方案
正文开始,在项目设置里勾选使用官方提供的缓存机制,有些官方的和自定义的程序集并不能分离成独立的zip包,因为没有配置xxx.extmap.xml文件(如果不了解看看前面链接)。
工作时,自写了一个extmap生成器,很简单的代码,下面说使用方法,提供程序下载。
进行命令行模式,格式: emGen <assembly> ,在同一目录下生成该程序集 .extmap.xml文件。
对于SilverLight客户端和类库(不是.net工程)库工程,为了生成程序集的extmap.xml文件,在生成后事件加:xxx\emGen.exe $(TargetFileName),意思是在每次生成后针对输出文件,生成一个对应的xml,这个xml不需要添加到工程。于是引用本库工程的应用工程,生成后看到xap内已经没有这个库工程的dll。当版本没有变化时,生成程序不会重写xml。
极少情况:对于加到工程内目录下的外部dll使,用emGen的方法:可以放在vs外部工具,命令参数选择“项路径”$(ItemPath),选择使用输出窗口。单击工程目录内(非引用集)dll文件项,然后点这个菜单项,xml在同目录下生成 。
在RIA工程时,解决SilverLight工程一,Libs\System.Windows.Controls.Data.DataForm.Toolkit.dll,不能放入xap的外部文件部分的问题,不是外部文件,会导致每次都要下载文件,原因是这个dll没有extmap.xml配置。
解决办法,VS2010生成的业务模板下,Libs目录下的System.Windows.Controls.Data.DataForm.Toolkit.dll,还是4.0的,要改成5.0的。
做法是删除原有的lib目录和引用,重新直接引用指向C盘目录里的C:\Program Files\Microsoft SDKs\Silverlight\v5.0\Toolkit\dec11\Bin,这里有extmap.xml文件。
情况:一个SL Lib库和一个SL APP,后者引用前者。用blend在Lib中编辑时,会自动加入SL系统库到引用。如果编辑后不做什么处理,直接浏览网页,就可能出现异常,原因是之前自动加入的系统库不在ClientBin,也是因为这些系统库没有在SL Lib工程中,于是虽然不需要,但是手动加这些系统库的引用。我遇到这几个Microsoft.Expression.Drawing.dll Microsoft.Expression.Effects.dll Microsoft.Expression.Interactions.dll,可能还会更多,再编译浏览网页正常。但这时发现这一个问题,这些类在部署包中没有分离,因为这些文件的目录下没有*.extmap.xml。解决步骤如下:
上述几个库通过查看引用的属性,发现文件在以下目录:C:\Program Files\Microsoft SDKs\Expression\Blend\Silverlight\v5.0\Libraries ,这个目录有访问限制,右键命令行模式,进入这个库目录,运行emGen.exe Microsoft.Expression.Drawing.dll等,再编译SL APP,查看ClientBin目录,可以看到这几个库都分离出来了。
使用emGen,我用的都是命名程序集,未签名同样可以生成,但分离没试过,应该可以。