開發WINDOWS應用程序通常都會有一個自動更新的功能,這就須要提供一個單獨的更新程序來更新主程序,那麼主程序怎麼檢測是否有更新,以及更新程序怎麼去更新主程序呢?下面將分開研究分析。html
用VS發佈嚮導發佈的都是安裝程序,每次更細都是將整個安裝程序下載下來從新安裝,有時候安裝程序過大而更新又比較平凡(好比咱們ERP系統中常常有模塊須要升級),爲了升級一個單獨的模塊而升級整個應用程序,這將嚴重影響用戶體驗。因而咱們採用下載遠程模塊DLL的方式,客戶端用XML文件來保存版本信息,服務器的版本信息保存在數據庫中。用戶每次運行客戶端主程序時,就去檢測客戶端的版本和服務器端的版本是否一致,不一致的話,就要啓動更新程序進行模塊更新。這裏解釋一下爲何要用更新程序去更新主程序,由於咱們首先運行的是主程序,主程序在運行過程當中是不能更新本身的,由於主程序文件正在使用,不能被遠程下載下來的文件覆蓋,因此不能在主程序中寫更新代碼邏輯來更新本身。那怎麼解決這個問題呢,這裏有一個小技巧,咱們在主程序路口點這樣處理一下:數據庫
using System; using System.Collections.Generic; using System.Windows.Forms; using MainForm;//主程序窗體所在的DLL using System.Diagnostics; namespace WindowsApplication1 { static class Program { /// <summary> /// 應用程序的主入口點。 /// </summary> [STAThread] static void Main(string[] args)//注意我入口點加了參數,正常建立應用程序時這裏是Main()不帶參數的 { //檢測主程序是不是由更新程序啓動的 if (args.Length > 0 && args[0] == "Updated") { //若是是,則運行主程序 Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new XtraForm3());//XtraForm3是主程序窗體 } else { //若是不是,則先運行更新程序檢查是否須要更新 Process process = new Process(); process.StartInfo.FileName = Application.StartupPath + "//YeXin2.0Update.exe";//更新程序所在位置 process.Start();//啓動更新程序 Application.Exit();//關閉主程序 } } } }
,咱們看到,若是不是由更新程序啓動的主程序(更新程序如何啓動主程序下面介紹),則會啓動更新程序,而後關閉本身,讓更新程序來更新主程序或者運行主程序。這樣主程序就不在運行中,能夠下載服務器的主程序DLL來覆蓋本地的主程序DLL實現更新主程序的目的。服務器
更新程序的邏輯網上應該有不少,我簡單闡述下個人邏輯,版本文件有一個總版本號,而後纔是各個模塊的本身的版本號。若是總版本號一致,則說明當前是最新程序,不去檢查各個模塊的版本號,反之,纔會去檢查各個模塊的版本號判斷是否須要更新模塊。spa
更新成功後,咱們須要同步本地文件的版本信息已經模塊DLL並啓動主程序。更新成功後咱們能夠這樣寫:.net
CopyFilesDirs(basesavepath, Application.StartupPath);//將下載下來的文件覆蓋本地的文件 Directory.Delete(basesavepath, true);//刪除本地臨時文件夾 UpdateVersionFile();//更新本地版本文件信息 if (MessageBox.Show("更新成功!啓動ERP程序嗎?", "更新提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) { if (File.Exists(Application.StartupPath + "//YeXinERP2WinForm.exe")) { Process process = new Process(); process.StartInfo.FileName = Application.StartupPath + "//YeXinERP2WinForm.exe"; process.StartInfo.Arguments = "Updated";//傳遞啓動參數,這裏是重點,主程序入口點須要判斷這個參數來判斷是不是由更新程序啓動的 process.Start(); } else { MessageBox.Show("沒有找到ERP運行程序!"); } }
這裏我是將服務器上下載下來的須要更新的文件保存在一個臨時文件夾下面,而不是邊下載邊覆蓋的形式,等所有下載完以後再覆蓋本地文件,刪除臨時文件夾。爲何這樣處理呢?由於有時候在下載過程當中可能會終止下載(用戶點取消下載按鈕終止或者非正常終止好比直接KILL更新程序的進程等等),若是採用下載直接寫本地文件的方式的話,可能會把本地文件破壞(一個1M的DLL文件,下載到一半的時候中斷更新程序,此DLL文件就被破壞了)。code
通常狀況下更新程序作好以後都不會有什麼改動,因此不須要更新本身,那麼我非要更新本身,該怎麼解決呢?那隻能把更新程序作成安裝程序了。用更新程序下載更新安裝程序,下載完後關閉更新程序,運行更新安裝程序更新本身。orm
以上是從網上找來的思路,它是啓動主程序,而後再啓動更新程序,再啓動主程序進入程序。既然這樣,那麼我想,我也能夠:直接每次啓動更新程序進入主程序,這樣作,能夠把主程序和更新程序徹底分開,以達到更新程序的直接複用。htm
在更新程序中:blog
1.能夠插入計時器來查看數據庫是否能夠鏈接上,以實現能夠連上數據庫時,自動連上。進程
2.更新程序。更新完成,啓動主程序。
出處:https://blog.csdn.net/spw55381155/article/details/79894055