在Silverlight应用开发过程中,经常会遇到需要加载大量第三方库的情况。这会导致XAP文件体积过大,从而增加首次加载应用时的下载时间。为了解决这个问题,可以采用将应用分割成多个项目,创建多个XAP文件,并利用按需下载功能。但是,当涉及到第三方库引用时,单独存储它们并在需要时下载可能会变得非常繁琐。本文将介绍一种更简单的处理方法。
应用库缓存并不是Silverlight4的新特性,它从Silverlight 3开始就已经存在。本文将深入探讨这一特性。首先,需要了解什么是应用库缓存。知道,可以通过编写代码使用WebClient下载外部XAP文件来实现按需下载。应用库缓存可以更简单地为完成这项工作。假设有一个较大的应用,并使用了大量第三方库,这个简单的步骤可以帮助将它们单独打包成一个压缩文件,按需下载,而无需编写任何额外的代码。
首先,将创建一个小型的Silverlight应用程序项目。打开Visual Studio并创建该项目。创建完成后,在解决方案资源管理器中,会看到它有一些默认的引用到一些程序集文件。构建项目后,它将为创建一个.XAP文件。
可以在客户端的bin目录中找到XAP文件。它创建的XAP文件数量与引用到该项目的程序集文件数量无关,并且不必要地增加了XAP文件的大小,无论是否需要它们。
要查看XAP内部的内容,请转到ClientBin文件夹。在那里,将找到Silverlight应用程序的XAP输出。众所周知,所有XAP文件实际上都是ZIP文件,因此可以通过更改其扩展名轻松地将其转换为ZIP文件。
打开ZIP文件。在其中,将找到"AppManifest.xaml"(存储引用程序集的信息),项目的DLL输出以及所有其他引用的程序集。如果在解决方案中添加了更多的第三方程序集引用,这个列表将会增加。
现在,将添加一些额外的DLL引用到项目中。为此,右键单击项目并点击"添加引用"。现在从添加引用对话框中,选择一些第三方DLL并将它们包含在项目中。
为了演示,将在解决方案中添加一些主题DLL。为此,搜索"theme",将看到添加引用对话框中列出了一些主题DLL。选择其中的一些并添加到项目中。
添加后,会注意到选定的程序集现在是项目的一部分。构建解决方案并打开新的XAP文件(将其重命名为ZIP)。将看到所有新引用的DLL现在都是XAP的一部分。
让打开"AppManifest.xaml"并看看它现在包含什么。哇,它包含了所有这些额外的DLL条目作为AssemblyPart,并指示从XAP本身加载它们。
这实际上增加了XAP的大小,使应用程序变得有点臃肿。因此,增加了应用程序的初始加载时间。
为了克服这个问题,让现在更改项目设置,使用应用库缓存功能。转到项目属性面板。在Silverlight标签中,会找到一个名为"通过使用应用库缓存减少XAP大小"的复选框。按照下面所示进行勾选。
现在再次构建项目,将看到它将创建与外部程序集数量相同的.ZIP文件。还会注意到它为单个引用的DLL程序集创建了一个单独的zip文件。
让深入了解一下应用程序清单。转到输出目录"ClientBin"。将看到一个XAP文件和一些ZIP文件,如下所示:
每个ZIP包含一个单独的DLL文件。重命名并打开XAP文件。打开XAP中的"AppManifest.xaml"。在这里,会注意到一个AssemblyPart指向原始项目输出,其余的DLL引用现在已移动到ExternalParts。它们现在指向ZIP文件而不是实际的DLL。
现在,当运行应用程序时,它只会下载包含主资源的XAP文件。其余的DLL ZIP将在应用程序需要时按需下载。