Silverlight 为应用程序开发提供以下两个截然不同的编程模型:

  • Silverlight 的托管 API,它使用在 Silverlight 的公共语言运行时 (CLR) 上运行的代码。可以将托管 API 用于已编译的语言(如 Visual Basic 和 C#)或动态语言(如 IronPython 和 IronRuby)。有关动态语言的更多信息,请参见 Silverlight Dynamic Languages SDK(Silverlight 动态语言 SDK)。

  • Silverlight 的 JavaScript API,它使用由浏览器解释的 JavaScript 代码。

这些编程模型截然不同,因为您在 Silverlight 插件的单个实例中不能同时使用它们。但是,您可以实现使用 JavaScript API 的初始屏幕,然后在加载您的应用程序时过渡到托管 API。

托管 API 提供比 JavaScript API 多很多的功能,在大多数 Silverlight 文档中都会涉及它。使用托管 API 的应用程序可以访问 .NET Framework 的轻量级版本,而 JavaScript API 只能访问 Silverlight 表示核心和浏览器 JavaScript 引擎。

 

托管编程模型和应用程序模型

托管 API 允许将托管程序集和资源文件打包为应用程序包 (.xap) 文件。Silverlight 插件负责加载应用程序包并提取其内容。

应用程序包必须包含一个程序集,该程序集具有从 Application 派生的类。Application 类封装您的应用程序和 Silverlight 插件之间的交互。例如,它允许您在宿主网页内显示用户界面。此外,它提供应用程序生存期事件和资源管理。

Silverlight 文档使用术语"应用程序模型"来指代Application 类封装的应用程序包和公共功能。该应用程序模型帮助您开发简单应用程序以及可以共享网络资源的复杂、可扩展应用程序。  

应用程序结构

Silverlight 激活系统使您能够指定要随您的应用程序提供的程序集和资源文件。生成系统将指定的文件捆绑到一个应用程序包中,该包是具有 .xap 文件扩展名的一个压缩的 zip 文件。

您可以使用应用程序库缓存来减少应用程序包的大小。在这种情况下,配置用于缓存的程序集将压缩成单独的 zip 文件。这些程序集称为 ExternalPart 程序集。

该应用程序包包括一个清单文件,该文件标识您的应用程序可使用的所有程序集。这包括:

  • 应用程序包中的程序集。

  • ExternalPart 程序集,这些是在启动时下载然后缓存的。

  • 您在启动之后可能下载的程序集。

该应用程序包至少还必须包括此程序集以及您的应用程序类(Silverlight 插件实例化这些类)。在您的应用程序启动时,它可以执行显示用户界面或检索附加资源之类的任务。

您必须决定在应用程序包中要部署哪些程序集和资源文件(如 ExternalPart 程序集)以及在启动后要检索哪些程序集和资源文件。一个常见的工作流就是将所有内容都放置于该应用程序包中,然后随着您的应用程序变大衡量下载和启动时间。在延迟变得较长时,应考虑提供初始屏幕、使用应用程序库缓存并在启动后检索某些文件。

有关 Silverlight 激活系统和用于分解您的应用程序的选项的更多信息,请参见应用程序结构。 



在您使用托管的 API 创建基于 Silverlight 的应用程序时,生成过程将生成一个应用程序包。应用程序包是一个压缩 (zip) 文件,它具有 .xap 文件扩展名。此文件通常包含您的主要应用程序程序集和资源。它还包括内部版本生成的清单,该清单描述此应用程序并指定它在启动时需要的所有程序集。这些程序集可以在应用程序包内部或外部。

当您在某一网页中嵌入 Silverlight 插件时,指定该插件应下载的应用程序包。该插件在该应用程序包中使用一个清单文件来标识要实例化的应用程序类。此类称为您的应用程序的"入口点",并且它必须从 Application 类派生。

下载应用程序启动文件并实例化应用程序类的过程称作 Silverlight 激活系统。通过该激活系统,您可以指定一个或多个包的最少初始下载以优化缓存。在激活后,您的应用程序可按需检索附加的库程序集和资源文件。

应用程序包

一个应用程序包包含以下文件:

  • 一个 AppManifest.xaml 文件,它标识打包的程序集和应用程序入口点。

  • 一个应用程序程序集,它包括您的应用程序类。

  • 零个或多个库程序集。

  • 零个或多个松散资源文件,例如图像文件或视频文件。

该 AppManifest.xaml 文件通常由生成过程生成,并且使用 XAML 标记来为您的应用程序声明 Deployment 对象。

在 AppManifest.xaml 文件中,Deployment 元素包括以下属性:

  • 一个 RuntimeVersion 属性,用于标识所需的 Silverlight 版本。

  • EntryPointTypeEntryPointAssembly 属性,用于标识应用程序入口点。

Deployment 元素还包括一个子 Deployment.Parts 属性元素,它为应用程序包中的每个程序集都具有一个子 AssemblyPart 元素。

如果您使用应用程序库缓存,Deployment 元素还可能包含一个子 Deployment.ExternalParts 属性元素。如果您添加了对于配置用于应用程序库缓存的库程序集的引用,则此元素存在。Deployment.ExternalParts 属性元素对于每个外部库包都具有一个子 ExtensionPart 元素。

该应用程序包必须包含一个 AppManifest.xaml 文件和一个入口点应用程序程序集。您可以将所有其他应用程序组件部署为"打包"文件、ExternalPart 文件或"按需"文件。

打包文件是在应用程序包中包括的文件。您通常包括应用程序在启动时所需的主要文件或者为避免启动后的延迟而必须可用的文件。还可以包括图像之类的共享资源,这些资源可嵌入在程序集中或作为应用程序包内的单独文件提供。

ExternalPart 文件是 zip 文件,其中包括应用程序启动时所需的一个或多个程序集。这些通常是库程序集,它们的更改机会小于主要应用程序文件。您可以通过在单独的下载中考虑这些因素来改进缓存效率。

按需文件是在服务器上部署的文件,通常与应用程序包处于同一位置。您的应用程序可以在激活后检索这些文件。根据文件类型和大小,存在若干用于检索按需文件的选项。例如,您可以使用直接 URI 引用来检索图像文件,或者可以开始异步下载以检索库程序集或 zip 文件。

 

 打包文件、外部文件、按需文件

您通常在决定下载和启动时间不可接受前在应用程序包内部署所有应用程序文件。此决定取决于应用程序的要求。例如,您可以在应用程序包内包括任意数目的文件,异步改进启动后的响应。在此情况下,可以通过提供初始屏幕在初始下载期间维护响应。有关更多信息,请参见 Silverlight 初始屏幕

您可以使用应用程序库缓存来减少应用程序包的大小。然而,这不会减少初始下载时间,它实际上会由于其他网络请求而导致下载时间增加。应用程序库缓存的优势在于您可以更改应用程序代码,而不要求回返者下载未更改的库程序集。

在某些情况下,Silverlight 插件将无法加载非常大的应用程序包。在您创建较大的应用程序时,应通过使用应用程序库缓存或按需检索某些文件,尽量降低应用程序包的大小。

在您决定将某些文件移出应用程序包时,有若干选项可供重新部署。

最容易重新部署的文件是使用相对 URI 引用的文件,例如图像文件或视频文件。当 Silverlight 插件在代码或 XAML 中遇到相对 URI 时,它会首先在应用程序包中进行查找。如果该插件在应用程序包中找不到相应文件,则会在主机服务器上进行查找。这意味着,您无需要求代码更改就可以移动按相对 URI 引用的任何文件。有关更多信息,请参见资源文件

许多文件类型不能按 URI 引用,并且在您将它们重新部署为按需文件时要求特殊处理。例如,如果您重新部署某一库程序集,则必须添加按需检索它的代码,并且将其加载到应用程序域中。在这种情况下,您仍必须在应用程序项目中引用该程序集,但应将"复制本地"值设置为"False"。这可防止内部版本将该程序集添加到应用程序包或在启动时要求该程序集(例如,ExternalPart 程序集)。

您还可能要将若干相关资源文件移出您的应用程序包,但按需将它们检索为单个下载。您可以通过将它们捆绑到在服务器上部署的某一 zip 文件中,执行上述操作。然后,必须添加按需检索该 zip 文件并提取其内容的代码。

 

应用程序库缓存可在用户重新访问网站时帮助改善启动性能。

当您使用应用程序库缓存时,Silverlight 将某些程序集打包成应用程序包外部的外部部件(.xap 文件)。应用程序包中的清单指定启动时所需的程序集,并指示它们是在应用程序包的内部还是外部。

当用户首次访问您的网页时,Silverlight 插件下载应用程序包以及所有需要的外部部件。这些文件添加到浏览器缓存中,以便可以在后续访问时再次使用。

所有下载的文件都受服务器和浏览器中的缓存配置设置约束。在典型的配置中,仅当文件不在缓存中或它们比缓存的版本更高时,才下载这些文件。

库程序集的更改机会远小于应用程序程序集。因此,将它们作为单独的文件进行缓存非常重要。这样,当您更改应用程序代码而非库代码时,许多回访者将只下载 .xap 文件。

Silverlight 随 Silverlight SDK 提供了许多库,而它们不是运行时的组成部分。这些库已预配置为用于应用程序库缓存。在 Visual Studio 中,这些库与运行时程序集一起位于"添加引用"对话框的".NET"选项卡上。还可以从 Silverlight SDK 文件夹访问它们。默认情况下,Silverlight SDK 安装在 %ProgramFiles%\Microsoft SDKs\Silverlight 文件夹中。还可以配置自己的程序集,以便支持应用程序库缓存。

下面的过程介绍如何启用和使用应用程序库缓存,以及如何配置自己的程序集进行缓存。

启用应用程序库缓存

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

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

    将显示项目设计器。

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

    说明:

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

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

    这会导致发生以下操作:

    • 程序集引用添加到项目中,其中"复制本地"值为 True。此值指示在启动时需要此程序集,并且该值与包内程序集使用的值相同。

    • 当您生成此项目时,生成操作会将此程序打包成一个单独的 zip 文件,并在应用程序清单中生成 ExtensionPart 元素。

    • 当 Silverlight 插件加载应用程序包时,它检查清单以搜索 ExtensionPart 元素,并下载所有对应的文件。如果您的应用程序实现初始屏幕,它将继续运行,直到加载所有外部部件。

将程序集配置为用于应用程序库缓存

  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>System.Json</name>
        <version>2.0.5.0</version>
        <publickeytoken>31bf3856ad364e35</publickeytoken>
        <relpath>System.Json.dll</relpath>
        <extension downloadUri="System.Json.zip" />
      </assembly>
    </manifest>

    nameversionpublickeytoken 元素必须与对应的程序集元数据相匹配。relpath 元素指示程序集文件名。最后,extension 元素通过 downloadUri 属性指示打包的外部部件的名称。

    downloadUri 属性 (Attribute) 值用于填充应用程序清单中的 ExtensionPart..::..Source 属性 (Property),如下面的清单摘要中所示。

     复制代码 
    <Deployment.ExternalParts>
      <ExtensionPart Source="System.Json.zip" />
    </Deployment.ExternalParts>

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

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

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

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

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

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

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

 

 

posted on 2012-08-27 10:02  寒舞逸  阅读(1431)  评论(3)    收藏  举报