雖然 ClickOnce 提供了完善的發布與更新方案,但其高度封裝導致安裝路徑不可控、更新流程難定制、UI 無法品牌化。針對企業級 C/S 架構應用,本文分享一個輕量級、可深度定制的自動更新組件實現全過程。
AutoUpdater.Update()UpdateInfo.xml (含版本號、文件列表、下載 URL)AssemblyVersion 為準),新版本則提示用戶AutoUpdater.sln
├── IAutoUpdater.cs // 對外介面
├── AutoUpdater.cs // 核心邏輯
├── AutoUpdater.config // 本地配置 (伺服器地址、臨時目錄等)
├── DownloadConfirm.cs // 更新提示 UI
├── DownloadProgress.cs // 下載進度 UI
├── CommonUtility.cs // 通用工具
├── Config.cs // 配置序列化
├── ConstFile.cs // 常量定義
├── DownloadFileInfo.cs // 遠程文件實體
├── LocalFile.cs // 本地文件實體
├── RemoteFile.cs // 伺服器文件實體
└── UpdateFileList.cs // 文件列表集合
UpdateInfo.xml (包含每個文件的版本、大小、雜湊值).xml、.dll、.exe 等靜態文件下載// Program.cs 或主視窗建構函式
bool hasError = false;
IAutoUpdater updater = new AutoUpdater();
try
{
updater.Update(); // 內含版本檢查、下載、替換、重啟
}
catch (WebException) { MessageBox.Show("無法連接更新伺服器"); hasError = true; }
catch (XmlException) { MessageBox.Show("更新配置文件損壞"); hasError = true; }
catch (Exception ex) { MessageBox.Show($"更新異常: {ex.Message}"); hasError = true; }
finally
{
if (hasError)
{
try { updater.RollBack(); } // 回滾機制
catch { /* 記錄日誌 */ }
}
}

圖 1:發現新版本時的確認對話框

圖 2:多線程下載進度顯示,支援取消操作
完整源碼託管於 CodePlex:https://autoupdater.codeplex.com/
後續規劃擴展:
此組件代碼精簡 (<2000 行),適合作為學習自動更新原理的教學案例,亦可直接用於中小型項目並按需二次開發。