ClickOnce 經驗談

ClickOnce 經驗談

  記得VS2005剛上市時,公司就極力想把目前在用的ERP系統升級上來,其中一個新的ClickOnce功能,也被納入期待能採用的更版技術,可能主管們在TechEd聽到多簡單,多好用等,所以才想要籍由此升級機會,把更版的方式改為ClickOnce,在這需求下,除了原本的程式碼升級痛苦外,又多了一個Study ClickOnce.

  剛碰時,確實很簡單,只要在專案屬性的地方設一設,就可以部屬了,簡單的幾個設定,就可以決定程式是要離線可使用(會出現在開始-程式集下),或是必需到網頁上點取才可以執行,或是更版的時機點.

image

  如果這麼簡單,就能搞定公司的使用者需求,那我就輕鬆了,可惜並不行,這個版本的管控與RollBack是公司很Care的地方,而ClickOnce的更版時機有兩個,一個是執行前,先檢查新版,有就先安裝,安裝好後,再執行程式,另一個是先執行,後檢查,如果有新版,下次再執行程式時,才會進行安裝.

image

  那麼執行過程中,有程式更版要怎麼辦? 使用者並不會那麼安份的關電腦才下班,所以隔天可能還是用到舊版的,或是程式有Critical Bug,不能等,必需即刻更新,那要怎麼辦,這個介面上並沒有辦法設定啊,這時就必需自行寫程式碼來達成.


{
    if (!(ApplicationDeployment.IsNetworkDeployed)) return; //確定此程式是否為ClickOnce所部署的程式
    System.Deployment.Application.ApplicationDeployment obj = ApplicationDeployment.CurrentDeployment;//取得目前使用者的版本資訊
    if (ApplicationDeployment.CurrentDeployment.CheckForUpdate())//比對伺服器上的版本
    {
        if (MessageBox.Show("發現新的版本,是否確定更版", "更版通知", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
        {
            obj.UpdateProgressChanged += new DeploymentProgressChangedEventHandler(obj_UpdateProgressChanged);
            obj.UpdateCompleted += new AsyncCompletedEventHandler(obj_UpdateCompleted);
            obj.UpdateAsync();            
         }
     }          
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

private void obj_UpdateProgressChanged(object sender, DeploymentProgressChangedEventArgs e)
{
    Progress_Update.Value = e.ProgressPercentage;
    Application.DoEvents();
}

private void obj_UpdateCompleted(object sender, AsyncCompletedEventArgs e)
{
    Application.Restart();
}

 

  以上這段程式碼就是自行寫程式去檢查版本並進行更版,不過或許有人對ApplicationDeployment.IsNetworkDeployed這行有點疑問,為什麼要加這行判斷?這程式本來就是用ClickOnce來部署的啊,多這判斷不是多此一舉? 剛開始,我也是沒有加這行Code,之所以會加上去,是我在開發階段時,並不是透過ClickOnce來部署的,所以每次在開發時,跑到這裡就會出問題,加了這行,才不會往下跑.

 

  看樣子,更版的問題似乎解決了,但還有個RollBack問題要解決,ClickOnce基本上就具有RollBack的功能,在新增移除程式的地方,使用者可以自行選擇是否要回到前一版還是移除程式,如果不讓使用者回到前一版,可以在當初發行時,指定最小版本,如果發行的最新版本=最小版本,那麼使用者只能移除,無法選擇回到前一版. 但如果要強制使用者RollBack,總不可能一個一個請使用者自行去新增移除程式的地方,自己去RollBack吧,而且之前如果有設最小版本=發行版本,使用者也無法RollBack,這個問題也讓我頭痛一段時間,最後想到的一個可行方法,就只能重新發佈前一版的程式,只是版次是加1號,所以原本是Ver 2要回到Ver 1,用Ver 1的程式碼重新發行,其版次設為Ver 3,最小版次為Ver 3,這樣使用者就會更到前一版的程式碼,而且也不能RollBack到Ver 2.

 

  ClickOnce是個不錯玩的功能,但要把它用在適合的地方,才能發揮它的功能,畢竟它也是需要一台Web Server,才能把這更版網頁放上去,並不是每間公司都願意放一台Web Server,或許是可以整併到DataBase Server那台,但還是有人不願意,希望DB單純化,所以反而Windows Installer會比較好用,反正用其它的寫法,同樣可以達成同樣的目標,何必為了更版多了一個Web,而且ClickOnce還是有部份的限制,只有Windows Installer才可以達成,所以除了自己寫的程式,目前還沒遇過其它ClickOnce的作品.

 

參考資訊 :

MSDN ClickOnce部署概觀

MSDN ApplicationDeployment 類別