winform自動升級方案
阿新 • • 發佈:2019-03-21
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 = newProcess(); 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自動升級方案