代码改变世界

Silverlight验证应用程序库缓存

2010-08-08 12:55  撞破南墙  阅读(1976)  评论(3编辑  收藏  举报

暑假培训完SL游戏。。。没什么太急的事情。开始系统的学习SL。

决定先学习一下SL官方文档。打好基础(突然想到了webabcd...见贤思齐啊。。。)

SL官方文档的词条

跳过前几个直接进入 

应用程序和编程模型

SL的应用程序模型中:

一个激活系统,它使得 Silverlight 插件能够下载您的应用程序在启动时需要的应用程序包和任何外部库程序集。

Application 类,该类封装基于 Silverlight 的应用程序通常要求的服务,例如生命周期事件通知和 Silverlight 插件的接口。

应用程序扩展性系统,此系统封装某些应用程序需要的其他服务,例如,自定义的数据访问层。

资源管理系统,这包括 URI 引用和回退机制、按需资源加载、样式和模板共享以及全球化支持。

为什么要学习这个

These features enable you to implement well-factored application structures that provide a balance between startup time and resource availability.

学习这些功能,能够让你把握好启动时间和资源下载的分配。

=======================不太理解====================================

以前没有接触过程序模型和编程模型这个概念

1应用程序结构

1 The Silverlight activation system enables you to specify which assemblies and resource files to include with your application.

使用激活系统你能知道你的程序要加载的资源和程序集。

2 The build system bundles the specified files into an application package, which is a compressed zip file that has a .xap file extension.

那个.XAP包其实就是一个zip

3You can reduce the size of the application package by using application library caching. ...... These assemblies are called ExternalPart assemblies.

启用应用程序库缓存

 

在"解决方案资源浏览器"中,选择要为其启用库缓存的 Silverlight 应用程序项目。

在"项目"菜单上,选择项目名称"属性"

将显示项目设计器。

在"Silverlight"选项卡上,选择"使用应用程序库缓存减少 XAP 大小"

 

说明:

不能在同一个应用程序中使用应用程序库缓存和浏览器外支持。浏览器外应用程序要求所有启动程序集驻留在应用程序包中。

添加对于 Silverlight SDK 中某个库程序集的引用,或者添加对于由有效的assemblyShortName.extmap.xml 映射文件伴随的任何程序集的引用。

 

我添加了一个Tools的库 还有用到了几个 控件

编译之后

XAP包中多了

System.Windows.Controls.zip  

发现了 AppManifest.xaml 的文件。

AppManifest (大型电脑的)主机中央处理机

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="SLstudy" EntryPointType="SLstudy.App" RuntimeVersion="4.0.50401.0">

  <Deployment.Parts>

    <AssemblyPart x:Name="SLstudy" Source="SLstudy.dll" />

    <AssemblyPart x:Name="Tools" Source="Tools.dll" />

  </Deployment.Parts>

  <Deployment.ExternalParts>

    <ExtensionPart Source="System.Windows.Controls.zip" />

  </Deployment.ExternalParts>

</Deployment>

很明显这是一个配置文件

public sealed class Deployment : DependencyObject

Deployment 类 

部署基于 Silverlight 的应用程序时,提供应用程序清单中的应用程序部件和本地化信息。

那么继续来看看每一个是什么意思 

 

Current

获取当前 Deployment 对象。

 

Dispatcher

获取与此对象关联的 Dispatcher。(继承自 DependencyObject。)

 

EntryPointAssembly

获取一个字符串名称,该名称标识 Deployment 中的哪个部分为入口点程序集。

 

EntryPointType

获取标识类的命名空间和类型名称的一个字符串,该类包含您应用程序的 Application 入口点。

 

ExternalCallersFromCrossDomain

获取一个值,该值指示跨域调用方对此部署中基于 Silverlight 的应用程序具有的访问级别。

 

ExternalParts

获取 ExternalPart 实例的集合,这些实例表示应用程序要求的外部程序集。

 

OutOfBrowserSettings

获取包含关于用于浏览器外支持的应用程序信息的对象。

 

Parts

获取部署中包含的程序集部件的集合。

 

RuntimeVersion

获取此部署支持的 Silverlight 运行时版本。

 

Deployment.ExternalParts

此类标识 Deployment.ExternalParts 集合中表示应用程序在启动时需要的外部库程序包的条目 

 

现在是没有添加进去的,那我们该如何做呢?

  1. 在程序集所在的相同位置创建一个映射文件。此文件必须与程序集同名,而将 .dll 文件扩展名替换为".extmap.xml"。例如,Silverlight SDK 程序集 System.Json.dll 具有名为 System.Json.extmap.xml 的映射文件。

  2. 按下面示例中所述将配置数据添加到映射文件中,并替换程序集元素中的值以与程序集匹配。

<?xml version="1.0"?>
<manifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd
="http://www.w3.org/2001/XMLSchema">
<assembly>
<name>Tools</name>
<version>1.0.0.0</version>
<relpath>Tools.dll</relpath>
<publickeytoken>fdbbc554-715b-4430-9db9-da059feb7f9c</publickeytoken>
<extension downloadUri="Tools.zip" />
</assembly>
</manifest>

 

PublicKeyToken 来自MSDN的解释

获取或设置一个 16 个字符的十六进制字符串,该字符串表示公钥的 SHA-1 哈希值的后 个字节。使用该公钥,可以对 Microsoft Visual Studio Tools for the Microsoft Office system3.0 版) 解决方案程序集进行签名。 

 

用工具查看的时候指示为NULL 我在配置文件里面去掉那个节点报错

 

点开里面居然又有了。。。原来叫做 version

 

 

乱试了几次。。居然被我试对了。。

fdbbc554-715b-4430-9db9-da059feb7f9c

 

 

如果 downloadUri 值是一个文件名,则当您添加对程序集的引用时,Visual Studio 提供以下支持:

生成系统将程序集打包成具有指定文件名的 zip 文件。此文件将被复制到输出目录中 .xap 文件旁边。

如果您使用相同的 downloadUri 文件名添加对于多个程序集的引用,则生成系统会将它们全部压缩成单个 zip 文件。

不会自动添加 .zip 扩展名。尽管打包文件是 ZIP 文件,但您可以使用服务器要求的任何文件扩展名。

如果 downloadUri 是一个绝对 URI,生成系统将不会对程序集打包。而是由您负责压缩程序集并将其部署到指定的 URI这可用于创建由多个应用程序使用的库的单一存储库。但是,当您使用绝对 downloadUri 值时,应考虑以下问题。

(多个程序共享一个库。。对于小游戏可能比较有用)

如果 URI 与 .xap 文件位于不同的域中,则该域必须在其根目录中具有跨域策略文件。有关更多信息,请参见 Silverlight 中的 HTTP 通信和安全

请记住,URI 是一个全局唯一标识符,可以引用非常具体的程序集文件。这意味着,您可以并且应该对不同的程序集版本使用不同的 URI。此外,当您在更新后的 URI 中部署新程序集版本时,应继续保持每个版本特定的 URI 和您创建的程序集。这有助于避免当使用 Silverlight 的一个版本构建的 .xap 文件试图加载使用其他版本构建的库时可能产生的问题。

 

 Ie中的表现

 在初始下载之后,对于应用程序包和库文件的其他请求将不会生成附加的下载通信。而是请求由缓存的副本完成。但是,当您重新生成应用程序时,将检测到更改并且下载新副本。 


指程序重新发布的时候,如果有些DLL没有变的话,他不会对他们额外请求。

如果你的Silverlight程序

不用做OOB模式

经常更新发布 (换肤或者简单的补丁)

那么可以考虑使用 这种方式。

 

只是一个感性的验证,没有分析其他的方面。如跨域等。

开始习惯写文章使的思考。分享式的思考学习。