天天看點

Silverlight自定義類庫實作應用程式緩存

預設情況下,如果SL項目引用了一些其它程式集(即通俗意義上的dll檔案),在編譯打包時,這些dll會全部打包到一個xap檔案裡,随着引用的dll檔案越來越多,xap檔案會越來越大。

這還不是最嚴重的問題,如果确實需要使用這些dll,大就大吧,要用它容量肯定就會增加。但是如果多個SL項目都要引用相同的程式集時,這些dll會重複打包進每個xap檔案,使用者在加載多個xap時,實際上是重複下載下傳了這部分dll檔案,帶寬使用率太低。

為了改善這種情況,SL引用了"應用程式庫緩存"的概念,在vs2010的SL項目中,打開SL項目的屬性頁,會看到一個選項:“通過使用應用程式庫緩存減少XAP大小(R)”

Silverlight自定義類庫實作應用程式緩存

勾上這個後,檢視一下最終的ClientBin目錄,會發現一些項目引用的其它程式集,已經分離出來變成了zip檔案

Silverlight自定義類庫實作應用程式緩存

再稍微唠叨一下:上圖中的MySLApp.xap在下載下傳時,怎麼知道會去加載System.Runtime.Serialization.Json.zip呢?

揭密:随便找個解壓軟體(比如WinRAR,WinZIP,7-ZIP之類),用它打開MySLApp.xap檔案,把裡面的AppManifest.xaml解壓出來,用記事本打開,會看到類似以下内容:

這裡的 <ExtensionPart Source="System.Xml.Serialization.zip" />就通知運作時加載同目錄下的System.Xml.Serialization.zip,首次加載時會下載下傳所有xap以及相關的zip檔案,以後再次浏覽頁面時,如果緩存沒有清空掉,zip檔案将直接從緩存中讀取,不會重複下載下傳。

但是有一個問題,隻有強命名的程式集可以這麼做,如果是使用者自己開發的類庫,預設情況下就算你勾選了這個選項,最終還是會将dll一起打包進xap檔案,如何也讓自己開發的SL類庫使用緩存呢?

步驟1:先為自己的SL類庫程式集(使用強名稱)簽名

這一步可以借助vs2010完成,見下圖

Silverlight自定義類庫實作應用程式緩存

然後重新編譯

步驟2:建立xml映射檔案

打開SL類庫的編譯輸出目錄(預設為bin\Debug目錄),建立一個xml檔案,檔案名規則如下

比如類庫輸出的dll檔案名為MyTools.dll,則這個xml檔案必須是MyTools.extmap.xml,即 "dll檔案主名+.extmap.xml"(且這個檔案必須跟dll檔案處于同一級目錄),内容如下:

解釋一下:

name 為SL類庫程式集的完整名稱

version 指版本号(必須與AssemblyInfo.cs中的版本号一緻)

publickeytoken 這個東東可以通過sn.exe工具檢視(後面會講到)

以上三項資訊,必須與程式集的中繼資料一緻

relpath 即為dll檔案的實體檔案名

downloadUri 這個一般把dll檔案名擴充名改成.zip即可

publickeytoken的檢視方法:

打開vs.net-->工具-->外部工具->添加

Silverlight自定義類庫實作應用程式緩存

标題輸入 Get SN Token(當然也可以改成你喜歡的名字)

指令輸入 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\sn.exe (即sn.exe的完整路徑)

參數輸入 -T $(TargetPath)

同時勾選"使用輸出視窗"

完事之後,vs.net工具菜單下,應該會出一個菜單項 Get SN Token

Silverlight自定義類庫實作應用程式緩存

在解決方案視窗上,選中SL類庫項目,先編譯通過,然後再選擇"Get SN Token"菜單,就能看到對應的publickeytoken,如下圖:

Silverlight自定義類庫實作應用程式緩存

步驟3:SL項目引用這個dll(或SL類庫),并正确勾選"通過使用應用程式庫緩存減少XAP大小(R)”即可

最終在ClientBin目錄下,會看到類似下面的輸出:

Silverlight自定義類庫實作應用程式緩存

可以看到VS已經自動将MyTools.dll打包成了zip檔案,然後檢視一下MySLApp.xap中的AppManifest.xaml内容

注意<ExtensionPart Source="MyTools.zip" />,vs也自動為我們添加了這一行。 

提示:如果您經過以上處理,vs.net仍然無法将程式集分離成zip包,請檢查項目的引用中,該程式集的“複制本地”屬性是否為false,如果不是,請更改為False

Silverlight自定義類庫實作應用程式緩存

注:應用程式緩存不适用于OOB方式