1. 程式人生 > >winform自動升級方案

winform自動升級方案

ssa 站點 edev class red 增量 load 分享 sum

未涉及過winform升級,研究一陣,大致出來個不成熟的方案。

我的解決方案(判斷升級,升級程序下載安裝包的壓縮包,解壓,自動安裝,重新啟動程序)。

1、首先根據服務器中軟件版本號和本地軟件版本號是否一致,來確認程序是否需要升級。

  1)本地可以用現成AssemblyInfo.cs文件中assembly: AssemblyVersion("1.0.0.0")來記錄,通過反射來獲取版本號:System.Reflection.Assembly.GetExecutingAssembly().GetName().Version。

  2)需要升級啟動升級程序Update.exe,並關閉主程序。

  Process p = new
Process();   p.StartInfo.UseShellExecute = false;   p.StartInfo.RedirectStandardOutput = true;   p.StartInfo.FileName = fileName;   p.StartInfo.CreateNoWindow = true;   p.StartInfo.Arguments = versionInfo.Url;//判斷是否需要升級時返回VersionInfo類型,包括新版本號和下載鏈接,傳值給升級程序   p.Start();   System.Environment.Exit(System.Environment.ExitCode);

2、升級程序。

  執行下載及解壓,覆蓋安裝。

  缺點:代碼有待優化;

     完全安裝,耗時;

     對網絡有要求;、

     本地數據庫不能保留原有數據。

  //升級程序接收參數
  static class Program
  {
        /// <summary>
        /// 應用程序的主入口點。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(
false); Application.Run(new FMUpdate(args)); }   }   private string _url;   public FMUpdate(string[] args)   {   InitializeComponent();   _url = args[0];   }
  
  private
void FMUpdate_Load(object sender, EventArgs e)   {   WebClient wc = new WebClient();   wc.DownloadProgressChanged += wc_DownloadProgressChanged;   wc.DownloadFileAsync(new Uri(_url), @"c:\update.rar");   }
技術分享圖片
private void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
            Action act = () =>
            {
                this.progressBar1.Value = e.ProgressPercentage;
                this.lblTip.Text = "正在下載...";
                //this.label1.Text = e.ProgressPercentage + "%";

            };
            this.Invoke(act);

            if (e.ProgressPercentage == 100)
            {
                //下載完成之後開始覆蓋
                this.lblTip.Text = "正在解壓...";

                try
                {
                    var result = CompressHelper.Uncompress(@"c:\update.rar", “解壓路徑”);
                    if (result)
                    {
                        progressBar1.Value = 110;
                        this.lblTip.Text = "準備安裝...";

                        //備份之前數據庫
                        var dbFile = Application.StartupPath + "/db/數據庫文件.db";
                        if (File.Exists(dbFile))
                        {
                            var bakFile = Application.StartupPath + "/backup/" + DateTime.Now.ToString("yyyyMMddHHmmssms") + ".bak";
                            var bakDirectory = Path.GetDirectoryName(bakFile);
                            DirectoryInfo directoryInfo = new DirectoryInfo(bakDirectory);
                            if (!directoryInfo.Exists)
                            {
                                directoryInfo.Create();
                            }
                            else
                            {
                                //刪除7天前的備份文件
                                var files = directoryInfo.GetFiles();
                                if (files != null && files.Length > 0)
                                {
                                    foreach (var file in files)
                                    {
                                        if (file.CreationTime.AddDays(7) < DateTime.Now)
                                        {
                                            file.Delete();
                                        }
                                    }
                                }
                            }
                            //備份文件
                            File.Move(dbFile, bakFile);
                        }
                        this.lblTip.Text = "準備安裝";
                        Install();
                        this.lblTip.Text = "安裝完成";
                        var mainFile = Application.StartupPath + @"\Main.exe";
                        Process p = new Process();
                        p.StartInfo.UseShellExecute = false;
                        p.StartInfo.RedirectStandardOutput = true;
                        p.StartInfo.FileName = mainFile;
                        p.StartInfo.CreateNoWindow = true;
                        p.Start();
                        this.Close();
                    }
                    else
                    {
                        MessageBox.Show("更新失敗");
                        this.Close();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("更新失敗", ex.Message);
                    this.Close();
                }

            }
    }


    private void Install()
    {
            try
            {
                Process p = new Process();
                p.StartInfo.FileName = "msiexec.exe";
                p.StartInfo.Arguments = $"/i {_temp}利萬嘉收銀系統安裝文件.msi /qb-!";// /qb顯示基本界面 /qb-!或者/qb!- 基本界面無取消按鈕
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.CreateNoWindow = true;
                p.Start();
                p.WaitForExit();
                p.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("更新失敗:" + ex.Message);
            }
    }
View Code

再說下關於增量升級。

1、單獨升級站點,保存項目的資源文件、程序集等。

2、xml記錄版本及更新的文件。

3、啟動升級程序,從升級站點直接拷貝修改的文件、程序集。

遺留問題:

1、增量升級跨多個版本,升級xml每個版本都記錄?

2、兩種方案對數據庫操作,執行數據庫腳本?如何執行?

求見解。。。。。。

winform自動升級方案