使用 AutoUpdater.NET 套件達成 WinForms 自動更新

在 WinForms 或是 WPF 專案中可以使用 AutoUpdater.NET 這個套件簡單的達成自動更新,本篇使用 .NET 8 的 WinForms 專案做示範。

前置作業

建立更新檔案

筆者這次示範的 WinFroms 專案名稱為 WinFormsAppAutoUpdateTest0516,建立這個專案的更新檔後將此檔案壓縮成 zip 檔案,該壓縮檔的檔案結構如下:
	
WinFormsAppAutoUpdateTest0516.zip/
`-- bin/
    `-- WinFormsAppAutoUpdateTest0516.exe

    

註: 在本次示範中並不會真的建立安裝檔,筆者將 WinForms 專案直接放在這個壓縮檔中,後續更新完就會自動執行這個 WinForms 應用程式,用來代替實際的更新程式。在實際使用中將更新檔放在這裡即可,更新後就會自動啟動更新程序。

最新版本資訊定義

本篇會使用到 AutoUpdater.NET 套件,而此套件會去讀取我們指定的網址,該網址需要回傳一個 xml 檔案,範例檔案內容如下(註: 後面會需要替換這裡的 url 連結和檔案路徑):
    
<?xml version=""1.0"" encoding=""UTF-8""?>
<item>
  <version>1.0.1</version>
  <url>http://localhost:5277/download</url>
  <mandatory>false</mandatory>
  <executable>bin\WinFormsAppAutoUpdateTest0516.exe</executable>
</item>
    

說明:
  • version:目標版本,會和當前專案比較,如果目標版本比較大就會彈出更新介面
  • url:下載更新檔案的連結
  • mandatory: 是否強制更新
  • executable: 上面 url 參數中下載下載的 zip 檔中的執行檔路徑和檔名,這裡的檔案結構對應到上面示範的 zip 檔結構,可以自行替換

建立測試用 API

本篇文章會需要呼叫兩個 API ,一個就是上面的「最新版本資訊定義」,還有一個就是下載更新檔的 zip 檔案連結。 目前我們並沒有這兩個 API ,為了方便示範和測試,這裡先使用 ASP.NET Core 8 Minimal API 專案快速建立這兩個 API 。 建立完專案後在 Program.cs 中貼入以下程式碼:
    
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

app.UseSwagger();
app.UseSwaggerUI();
app.UseHttpsRedirection();

app.MapGet("/download", () =>
    {
        var filePath = @"C:\Users\ruyut\WinFormsAppAutoUpdateTest0516.zip";
        var fileInfo = new FileInfo(filePath);
        if (!fileInfo.Exists) return Results.NotFound();

        return Results.File(fileInfo.OpenRead(), "application/zip", fileInfo.Name);
    })
    .WithName("DownloadFile")
    .WithOpenApi();


// 軟體更新資訊
app.MapGet("/updates/latest-version.xml", () =>
    {
        var xml =
            @"<?xml version=""1.0"" encoding=""UTF-8""?>
<item>
  <version>1.0.1</version>
  <url>http://localhost:5277/download</url>
  <mandatory>false</mandatory>
  <executable>bin\WinFormsAppAutoUpdateTest0516.exe</executable>
</item>
";
        return Results.Text(xml, "application/xml");
    })
    .WithName("GetLatestVersion")
    .WithOpenApi();


app.Run();
    

上面的程式碼只有增加兩個 API ,分別是:

下載檔案:
    
/download
    

取得最新版本資訊定義:
    
/updates/latest-version.xml


使用下面的指令啟動專案:
    
dotnet watch 


筆者這裡的測試 port 為 5277 ,所以兩個下載連結如下:
    
http://localhost:5277/download
http://localhost:5277/updates/latest-version.xml


請自行替換連結後開啟網頁確認是否可以讀取到 xml 資料和下載檔案。

建立範例 WinForms 專案

首先先建立 WinForms 專案, 然後使用 NuGet 安裝 Autoupdater.NET.Official 套件,或是使用 .NET CLI 執行以下指令安裝
	
dotnet add package Autoupdater.NET.Official 
    

在 Form1.cs 檔案中加入以下內容:
    
using AutoUpdaterDotNET;


public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        Button checkUpdateButton = new()
        {
            Text = "檢查更新",
            AutoSize = true,
        };
        checkUpdateButton.Click += (sender, e) =>
        {
            AutoUpdater.Start("http://localhost:5277/updates/latest-version.xml");
        };
        this.Controls.Add(checkUpdateButton);
    }
}
    

在上面我們動態增加了一個按鈕,重點是第 17 行,將連結替換為可以開啟我們 xml 的那個 API,只要 API 中的 version 比我們當前應用程式的版號還高,就會跳出更新通知:

點選更新後就會自動下載 zip 檔案、解壓縮並執行,所以只要把安裝檔放到壓縮檔內,就可以完成自動更新了!

參考資料:
GitHub - ravibpatel/AutoUpdater.NET

留言

張貼留言

如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com