首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 應用程式線上自動更新框架設計與實作

     編輯:關於C#

架構概覽

自動更新系統包含四大元件:

  • UpdaterExc.exe:獨立更新執行程式(由主程式啟動),負責下載、解壓、替換檔案、重啟主程式。
  • FaibClass.Update.dll:主程式引用,負責版本檢查、下載更新清單、啟動 UpdaterExc。
  • Updater.xml:伺服器端版本清單,記錄每版本號、發布日期、更新說明、下載壓縮包路徑。
  • 版本壓縮包:.zip/.rar 含需更新的檔案(DLL、EXE、設定檔等),放置於伺服器對應路徑。

伺服器端 Updater.xml 結構

<?xml version="1.0" encoding="utf-8"?>
<Items>
  <UpdaterItem>
    <Name>V1.0.0.25</Name>
    <Version>1.0.0.25</Version>
    <Date>2024-01-15T10:30:00</Date>
    <Descript>
      <string>修正報表匯出錯誤</string>
      <string>新增客戶匯入範本</string>
    </Descript>
    <FileName>releases/1.0.0.25.zip</FileName>
    <CloseMain>true</CloseMain>
  </UpdaterItem>
  <UpdaterItem>
    <Name>V1.0.0.26</Name>
    <Version>1.0.0.26</Version>
    <Date>2024-02-01T09:00:00</Date>
    <Descript>
      <string>優化資料庫查詢效能</string>
      <string>修正多執行緒競爭條件</string>
    </Descript>
    <FileName>releases/1.0.0.26.zip</FileName>
    <CloseMain>true</CloseMain>
  </UpdaterItem>
</Items>

客戶端 UpdaterExc.exe.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="MainExeName" value="MyApp.exe" />
    <add key="UseConfigVersion" value="true" />
    <add key="ServerUrl" value="https://update.mydomain.com/" />
    <add key="UpdaterXml" value="Updater.xml" />
    <add key="CurrentVersion" value="1.0.0.24" />
    <add key="BlockSize" value="8192" />
  </appSettings>
</configuration>

主程式整合代碼

using FaibClass.Update;
using System.Reflection;
using System.Windows.Forms;

public static class AutoUpdater
{
    public static void CheckAndUpdate()
    {
        try
        {
            var updater = new Updater(Assembly.GetExecutingAssembly());
            if (updater.CheckUpdate())
            {
                if (MessageBox.Show("發現新版本,是否立即更新?", "自動更新",
                    MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    updater.BeginUpdate(); // 啟動 UpdaterExc.exe 並關閉主程式
                    Application.Exit();
                }
            }
            else
            {
                // 自動更新更新器本體
                SelfUpdateUpdater();
            }
        }
        catch (Exception ex)
        {
            Log.Error("自動更新檢查失敗", ex);
        }
    }

    private static void SelfUpdateUpdater()
    {
        string newExe = Path.Combine(Application.StartupPath, "UpdaterExc.exc"); // 臨時副檔名
        string oldExe = Path.Combine(Application.StartupPath, "UpdaterExc.exe");
        if (File.Exists(newExe))
            File.Replace(newExe, oldExe, null, true); // 原子替換
    }
}

UpdaterExc.exe 核心流程

  1. 解析命令列參數(主程式路徑、伺服器 URL、版本清單 XML)。
  2. 下載 Updater.xml,比對本地版本,建立待更新清單。
  3. 顯示 UI:進度條、版本說明、預估大小。
  4. 使用者點擊「開始更新」:
  5. 依序下載每個版本壓縮包 → 解壓至暫存目錄 → 備份舊檔 → 複製新檔 → 註冊 DLL(如需)。
  6. 全部完成 → 修改本地版本號設定 → 啟動主程式 → 自身退出。

關鍵技術細節

挑戰解決方案
主程式執行中無法覆蓋 EXE/DLL由獨立 UpdaterExc 執行更新,主程式已退出
更新過程中斷電/網路中斷採用「備份→複製→驗證→提交」原子操作,失敗可回滾
多版本累積更新Updater.xml 含所有歷史版本,客戶端按順序逐版套用
更新器自身更新下載為 .exc 副檔名,完成後 File.Replace 原子替換
權限不足(Program Files)UpdaterExc 以管理員權限啟動(manifest requireAdministrator)
簽名驗證下載後驗證 SHA256/數位簽章,防止中間人攻擊

現代化替代方案

  • Squirrel.Windows:GitHub 推薦,支援 Delta 更新、自動建立捷徑、ClickOnce 相容。
  • NetSparkle:跨平台 Sparkle 框架移植,支援 AppCast (RSS) 版本清單。
  • Microsoft Store / Winget / Chocolatey:交給平台管理更新,開發者只需發布套件。
  • 自建 Web API + 背景下載:.NET 6+ HttpClient + System.IO.Compression + Process.Start 重啟,完全自主可控。

總結

自動更新框架核心在於主程式與更新器分離、版本清單驅動增量更新、原子替換保證一致性。本文提供傳統 WinForms 架構完整設計,包含伺服器 XML 結構、客戶端配置、主程式整合、更新器流程與關鍵技術細節。現代專案建議評估 Squirrel.Windows 或平台原生部署工具,減少自建維護成本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved