自動更新程序AutoUpdate.exe
https://git.oschina.net/victor596jm/AutoUpdate.git
1.獲取源碼 http://git.oschina.net/victor596jm/AutoUpdate 編譯成 AutoUpdate.exe,AutoUpdateLib.dll,並與你的主程序放在同一個目錄
2.配置文件 UpdateList.xml
此配置文件記錄要更新的文件列表,版本等信息。文件同時存在於服務器(IIS)和客戶端,當AutoUpdate.exe啟動時會根據客戶端的Updatelist.xml文件的節點<Url>獲取本次更新源(可以有Url,Url1,Url2,Url3節點,更新時會測速選擇最優的線路),然后下載服務器的UpdateList.xml文件與本地文件進行比較確定此次要更新的文件列表.執行更新后最終服務器的Updatelist.xml與客戶端的文件會保持一致.Updatelist.xml文件如下:
<?xml version="1.0" encoding="gb2312"?> <AutoUpdater> <description>AutoUpdate</description> <Updater> <RootUrl>http://d1.domain.com:8765/vf/</RootUrl> <RootUrl1>http://d1.domain.com:8765/vf/</RootUrl1> <Url>http://update.domain.com:8765/vf/</Url> <!-- 客戶端使用這個地址作為更新源 --> <NeedUpdate>YES</NeedUpdate> <!-- 客戶端根據此設置是否要執行更新 --> <RequiredVersion>8.8.0</RequiredVersion> <Continue>YES</Continue> <LastUpdateTime>2013-10-15</LastUpdateTime> </Updater> <Application applicationId="你的應用程序名稱"> <EntryPoint>主應用程序名稱.exe</EntryPoint> <!-- 自動程序會依據這個配置殺死主程序以便於執行更新后文件覆蓋 --> <Location>.</Location> <Version>2.05.111</Version> <!-- 程序版本,注意更新程序不會依據此版本來獲取更新文件列表 --> <MinVersion>2.01.144</MinVersion> <VersionSort>Professional</VersionSort> </Application> <Files> <File IsKeyUpt="1" Ver="2.0.2.27" Name="xxx.exe" /> <File IsKeyUpt="0" Ver="2.0.0.2" Name="CreateShortCut.exe" /> <File IsKeyUpt="0" Ver="2.0.0.5" Name="UpdateJob.txt" RenameTo="UpdateJob.cmd" /> <File IsKeyUpt="0" Ver="2.0.0.1" Name="SYNC\Sync.exe.config.xml" RenameTo="SYNC\Sync.exe.config" /> </Files> </AutoUpdater>
說明:
(1). IsKeyUpt :是否關鍵更新 如果在更新過程中某關鍵更新文件未能下載成功,則會忽略本次更新
(2). Ver:記錄文件版本
客戶端版本小於服務器版本則會把文件加到更新列表中, 比如 服務端為 : 3.0.0.1,客戶端為 1.0.0.01 ,忽略'點'即 (3001<10001,這時文件不會更新,記得服務器版本要寫成 3.0.0.01 就可以了,如果覺得不妥你可以自己修改 )
(3). RenameTo: 文件名重命名 因為有些文件是無法從IIS下載的如 .bat,.cmd文件,這時你可以在服務端重命名為可更新的文件,客戶端更新后會根據設置自動改名
3.主程序應用集成自動更新程序
我的做法是:在主程序應用不帶參數執行的情況下要自動啟動AutoUpdate.exe來執行更新操作, 當更新程序發現如果可用的更新就自已退出;如果有則執行更新,在文件下載后更新程序會自動殺死主進程,然后覆蓋文件,在完成覆蓋文件后再以參數 /NOUPDATE啟動主進程
可以在 Main(string[] args) 嵌入以下代碼,先在主工程中引用 AutoUpdateLib.dll
//以下語句啟動自動更新功能
bool MainProgRunned = (clsPublic.ProgProcessCount("你的主應用應用.EXE") > 1); if ((null == Args || Args.Length == 0) && (!MainProgRunned)) { try { Process proc = Process.GetCurrentProcess(); string curProcess = proc.ProcessName.ToUpper(); if (Common.AutoUpdateFunc.NeedUpdate && curProcess.IndexOf("VSHOST") < 0) { new BIN.AutoUpdateFunc("UpdateList.xml")).InvokeAutoUpdate(); } } catch (Exception ex) { } }
Common.ProgRunned("AutoUpate.exe", true); //殺死自動更新程序
//啟動主界面
另外,下載文件沒有加MD5檢驗
