詳解C# WinForm如何實(shí)現(xiàn)自動更新程序
前言
在C/S這種模式中,自動更新程序就顯得尤為重要,它不像B/S模式,直接發(fā)布到服務(wù)器上,瀏覽器點(diǎn)個刷新就可以了。由于涉及到客戶端文件,所以必然需要把相應(yīng)的文件下載下來。這個其實(shí)比較常見,我們常用的微信、QQ等,也都是這個操作。
自動更新程序也分為客戶端和服務(wù)端兩部分,客戶端就是用來下載的一個小程序,服務(wù)端就是供客戶端調(diào)用下載接口等操作。
這里第一步先將服務(wù)端代碼寫出來,邏輯比較簡單,使用xml文件分別存儲各個文件的名稱以及版本號(每次需要更新的時候,將需要更新的文件上傳到服務(wù)器后,同步增加一下xml文件中對應(yīng)的版本號)。然后比對客戶端傳進(jìn)來的文件版本,若服務(wù)端版本比較高,則加入到下載列表中??蛻舳嗽傺h(huán)調(diào)用下載列表中的文件進(jìn)行下載更新。

開發(fā)環(huán)境
.NET Core 3.1
開發(fā)工具
Visual Studio 2019
實(shí)現(xiàn)代碼
//xml文件
<?xml version="1.0" encoding="utf-8" ?>
<updateList>
<url>http://localhost:5000/api/Update/</url>
<files>
<file name="1.dll" version="1.0"></file>
<file name="1.dll" version="1.1"></file>
<file name="AutoUpdate.Test.exe" version="1.1"></file>
</files>
</updateList> //Model
public class UpdateModel {
public string name { get; set; }
public string version { get; set; }
}
public class UpdateModel_Out {
public string url { get; set; }
public List<UpdateModel> updateList { get; set; }
}//控制器
namespace AutoUpdate.WebApi.Controllers {
[Route("api/[controller]/[Action]")]
[ApiController]
public class UpdateController : ControllerBase {
[HttpGet]
public JsonResult Index() {
return new JsonResult(new { code = 10, msg = "success" });
}
[HttpPost]
public JsonResult GetUpdateFiles([FromBody] List<UpdateModel> input) {
string xmlPath = AppContext.BaseDirectory + "UpdateList.xml";
XDocument xdoc = XDocument.Load(xmlPath);
var files = from f in xdoc.Root.Element("files").Elements() select new { name = f.Attribute("name").Value, version = f.Attribute("version").Value };
var url = xdoc.Root.Element("url").Value;
List<UpdateModel> updateList = new List<UpdateModel>();
foreach(var file in files) {
UpdateModel model = input.Find(s => s.name == file.name);
if(model == null || file.version.CompareTo(model.version) > 0) {
updateList.Add(new UpdateModel {
name = file.name,
version = file.version
});
}
}
UpdateModel_Out output = new UpdateModel_Out {
url = url,
updateList = updateList
};
return new JsonResult(output);
}
[HttpPost]
public FileStreamResult DownloadFile([FromBody] UpdateModel input) {
string path = AppContext.BaseDirectory + "files\\" + input.name;
FileStream fileStream = new FileStream(path, FileMode.Open);
return new FileStreamResult(fileStream, "application/octet-stream");
}
}
}實(shí)現(xiàn)效果
只有服務(wù)端其實(shí)沒什么演示的,這里先看一下更新的效果吧。

代碼解析
就只介紹下控制器中的三個方法吧,Index其實(shí)沒什么用,就是用來做個測試,證明服務(wù)是通的;GetUpdateFiles用來比對版本號,獲取需要更新的文件(這里用到了Linq To Xml 來解析xml文件,之前文章沒寫過這個方式,后面再補(bǔ)下);DownloadFile就是用來下載文件的了。
到此這篇關(guān)于詳解C# WinForm如何實(shí)現(xiàn)自動更新程序的文章就介紹到這了,更多相關(guān)C# WinForm自動更新程序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#編程實(shí)現(xiàn)連接SQL SERVER數(shù)據(jù)庫實(shí)例詳解
這篇文章主要介紹了C#編程實(shí)現(xiàn)連接SQL SERVER數(shù)據(jù)庫的方法,以實(shí)例形式較為詳細(xì)的分析了C#連接SQL SERVER數(shù)據(jù)庫的相關(guān)步驟與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-11-11
Unity基于ShaderLab實(shí)現(xiàn)光照系統(tǒng)(著色器代碼實(shí)現(xiàn)小結(jié))
這篇文章主要介紹了Unity基于ShaderLab實(shí)現(xiàn)光照系統(tǒng),主要總結(jié)unity中shaderlab的著色器代碼實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01
C#運(yùn)算符大全_各種運(yùn)算符號的概述及作用
以下是對C#中各種運(yùn)算符號的說明及作用進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-10-10
c#開發(fā)的程序安裝時動態(tài)指定windows服務(wù)名稱
前段時間由于項目的需求,要在Windows里把同樣的組件制作成多個不同名稱的服務(wù),這些服務(wù)完成類似的功能,僅需要修改業(yè)務(wù)配置文件2012-06-06
解析C#設(shè)計模式編程中適配器模式的實(shí)現(xiàn)
這篇文章主要介紹了C#設(shè)計模式編程中適配器模式的實(shí)現(xiàn),分別舉了類的對象適配器與對象的適配器模式的例子,需要的朋友可以參考下2016-02-02
c#之獲取本機(jī)主機(jī)名的四種方式總結(jié)
這篇文章主要介紹了c#之獲取本機(jī)主機(jī)名的四種方式總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

