之前開發了一個Silverlight 5的OOB應用程序,但是在更新上遇到一種特殊情況。
OOB應用程序的更新方式
承載在瀏覽器中的Silverlight應用程序可以自動更新,但是OOB應用程序可能處於安全性的看哦啊率卻不能自動更新,需要調用一個檢查更新的方法來手動執行更新。
首先為Application的CheckAndDownloadUpdateCompleted事件注冊一個處理程序,如下:
_app = Application.Current;
if (_app.IsRunningOutOfBrowser)
_app.CheckAndDownloadUpdateCompleted += Application_CheckAndDownloadUpdateCompleted;
然后在創建一個更新按鈕,在按鈕點擊事件中添加檢查更新的代碼,如下:
private void button1_Click(object sender, RoutedEventArgs e) { if (_app.IsRunningOutOfBrowser && NetworkInterface.GetIsNetworkAvailable()) _app.CheckAndDownloadUpdateAsync(); }
當然,以上代碼也可以放到頁面加載事件中,讓程序每次啟動的時候都自動檢查更新,但是最佳實踐是,創建一套自動檢查版本的機制,然后提示用戶有更新,再運行上述代碼。
最后,就是編寫更新完成后的處理代碼,如下:
void Application_CheckAndDownloadUpdateCompleted(object sender, CheckAndDownloadUpdateCompletedEventArgs e) { if (e.Error != null) { if (e.Error is PlatformNotSupportedException) MessageBox.Show("App_NeedUpgradePlatform"); else MessageBox.Show("App_UpgradeError: " + e.Error.Message); return; } if (e.UpdateAvailable) MessageBox.Show("App_UpgradeCompleted"); else MessageBox.Show("App_NoUpdate"); }
這就是更新OOB應用程序的基本方法。
提升信任后的OOB應用程序更新
MSDN文檔中對於提升信任后的OOB應用程序的更新,有一個特殊說明,如下:
Silverlight 4 為運行具有提升的信任的瀏覽器外應用程序提供支持。受信任的應用程序不能使用本節中描述的更新機制,除非應用程序和更新都使用同樣有效的、代碼簽名證書進行了簽名。若要更新沒有有效簽名的受信任的應用程序,用戶必須卸載舊版本並且手動安裝新版本。有關更多信息,請參見受信任的應用程序。
這句話的意思就是,如果前后更新使用了不同簽名文件,或者老版本沒有簽名,新版本進行了簽名,這兩種情況都會導致不能進行更新,需要卸載重裝。
也就是這句話誤導了我半天。
經歷不能更新的特殊情況
我開發的OOB應用程序一開始是可以進行更新的,后來不知為何不能進行更新了。尋找了各種原因,嘗試了各種方法,推測了各種情況,都無果而終。
最后,我單獨建立了一個測試項目來對比測試,在所有配置和代碼都一樣的情況卻可以更新,讓我開始考慮是否是Silverlight SDK有問題。在對比了整個項目的文件后,發現測試項目比正式項目少一個文件——InBrowserSettings.xml。這個文件其實是Silverlight 5提供的一個新特性,即在瀏覽器內提升信任功能生成的一個配置文件。
這個文件估計是什么時候,我嘗試勾選”提升瀏覽器內信任“的選項的時候,生成的;於是我刪除了InBrowserSettings.xml這個配置文件。還是問題依舊,不過感覺已經接近問題所在了。之前有過經驗,一些配置信息之csproj中也會記錄,所以打開csproj文件,發現里面有InBrowserSettingsFile和RequireInBrowserElevation節點;於是把這兩個節點刪除后,經測試就可以更新成功了。