更新判斷方式與v1.0的區別
v2.0不再使用版本號碼來區分更新是否可用,而是採用manifest ID+application ID來判斷,對於每一個新的更新,即使是同一個應用程式,必須更新manifest ID。同時要注意,一個應用程式的application ID一旦確定就不能隨意改變,因為用戶端的設定檔中,已經寫入了確定了的application ID,不能改變,當然你可以嘗試通過更新用戶端的設定檔來改變application ID。
更新檢查 調用過程
1. 用戶端建立一個ApplicationUpdaterManager執行個體,ApplicationUpdaterManager將負責整個升級過程式控制制
2. 調用ApplicationUpdaterManager的CheckForUpdates()方法
3. CheckForUpdates()內部調用CheckForUpdates(Uri Location)方法,其中的Location是伺服器端Manifest檔案的url路徑,可通過UpdaterConfigurationView.DefaultManifestUriLocation獲得。
4. CheckForUpdates(Uri Location)中有兩個處理過程,一個是處理上一次更新過程中未完成的更新,一個是從伺服器段下載最新的manifest檔案,並判斷是否要進行更新。
5. CheckForPendingUpdates()是專門用來處理未完成的更新的,該函數通過調用RegistryManager.Tasks屬性獲得未完成的工作清單。讓我們來看看Tasks屬性的實現
private Hashtable Tasks
{
get
{
if ( !loaded )
{
Load();
loaded = true;
}
return registry;
}
}
如果Tasks沒有初始化過,則會調用Load()方法,該方法枚舉每一個在AppRoot/registry中的檔案,並將這些檔案的控制代碼傳給LoadTask()方法,最後會把每一個儲存在registry目錄下的未完成任務讀入Tasks,這樣就可以把這些任務傳給ApplicationUpdaterManager.OnPendingUpdatesDetected()事件進行處理。
6. 下載和獲得Manifest檔案則是通過ManifestManager.GetManifests()方法完成的。
用戶端目錄用途
AppRoot/registry 存放未完成的task資訊檔(xml格式)
AppRoot/applications 存放應用程式的升級檔案和相關設定,該目錄下有若干個目錄,這些目錄都對應一個應用程式的升級,每一個應用程式的升級檔案分別儲存在相應的目錄下。