在 WinForms 或是 WPF 專案中可以使用 AutoUpdater.NET 這個套件簡單的達成自動更新,本篇使用 .NET 8 的 WinForms 專案做示範。
註: 在本次示範中並不會真的建立安裝檔,筆者將 WinForms 專案直接放在這個壓縮檔中,後續更新完就會自動執行這個 WinForms 應用程式,用來代替實際的更新程式。在實際使用中將更新檔放在這裡即可,更新後就會自動啟動更新程序。
說明:
上面的程式碼只有增加兩個 API ,分別是:
下載檔案:
取得最新版本資訊定義:
使用下面的指令啟動專案:
筆者這裡的測試 port 為 5277 ,所以兩個下載連結如下:
請自行替換連結後開啟網頁確認是否可以讀取到 xml 資料和下載檔案。
在 Form1.cs 檔案中加入以下內容:
在上面我們動態增加了一個按鈕,重點是第 17 行,將連結替換為可以開啟我們 xml 的那個 API,只要 API 中的 version 比我們當前應用程式的版號還高,就會跳出更新通知:
點選更新後就會自動下載 zip 檔案、解壓縮並執行,所以只要把安裝檔放到壓縮檔內,就可以完成自動更新了!
參考資料:
GitHub - ravibpatel/AutoUpdater.NET
前置作業
建立更新檔案
筆者這次示範的 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
感謝教學!
回覆刪除