[C.C++] 详解C# WinForm如何实现自动更新程序

1964 0
黑夜隐士 2022-11-5 08:31:56 | 显示全部楼层 |阅读模式
目录

    前言开发环境开发工具实现代码实现效果


前言

在C/S这种模式中,自动更新程序就显得尤为重要,它不像B/S模式,直接发布到服务器上,浏览器点个刷新就可以了。由于涉及到客户端文件,所以必然需要把相应的文件下载下来。这个其实比较常见,我们常用的微信、QQ等,也都是这个操作。
自动更新程序也分为客户端和服务端两部分,客户端就是用来下载的一个小程序,服务端就是供客户端调用下载接口等操作。
这里第一步先将服务端代码写出来,逻辑比较简单,使用xml文件分别存储各个文件的名称以及版本号(每次需要更新的时候,将需要更新的文件上传到服务器后,同步增加一下xml文件中对应的版本号)。然后比对客户端传进来的文件版本,若服务端版本比较高,则加入到下载列表中。客户端再循环调用下载列表中的文件进行下载更新。



开发环境

.NET Core 3.1

开发工具

Visual Studio 2019

实现代码
  1. //xml文件
  2. <?xml version="1.0" encoding="utf-8" ?>
  3. <updateList>
  4.   <url>http://localhost:5000/api/Update/</url>
  5.   <files>
  6.     <file name="1.dll" version="1.0"></file>
  7.     <file name="1.dll" version="1.1"></file>
  8.     <file name="AutoUpdate.Test.exe" version="1.1"></file>
  9.   </files>
  10. </updateList>
复制代码
  1. //Model
  2.   public class UpdateModel {
  3.         public string name { get; set; }
  4.         public string version { get; set; }
  5.     }
  6.     public class UpdateModel_Out {
  7.         public string url { get; set; }
  8.         public List<UpdateModel> updateList { get; set; }
  9.     }
复制代码
  1. //控制器
  2. namespace AutoUpdate.WebApi.Controllers {
  3.     [Route("api/[controller]/[Action]")]
  4.     [ApiController]
  5.     public class UpdateController : ControllerBase {
  6.         [HttpGet]
  7.         public JsonResult Index() {
  8.             return new JsonResult(new { code = 10, msg = "success" });
  9.         }
  10.         [HttpPost]
  11.         public JsonResult GetUpdateFiles([FromBody] List<UpdateModel> input) {
  12.             string xmlPath = AppContext.BaseDirectory + "UpdateList.xml";
  13.             XDocument xdoc = XDocument.Load(xmlPath);
  14.             var files = from f in xdoc.Root.Element("files").Elements() select new { name = f.Attribute("name").Value, version = f.Attribute("version").Value };
  15.             var url = xdoc.Root.Element("url").Value;
  16.             List<UpdateModel> updateList = new List<UpdateModel>();
  17.             foreach(var file in files) {
  18.                 UpdateModel model = input.Find(s => s.name == file.name);
  19.                 if(model == null || file.version.CompareTo(model.version) > 0) {
  20.                     updateList.Add(new UpdateModel {
  21.                         name = file.name,
  22.                         version = file.version
  23.                     });
  24.                 }
  25.             }
  26.             UpdateModel_Out output = new UpdateModel_Out {
  27.                 url = url,
  28.                 updateList = updateList
  29.             };
  30.             return new JsonResult(output);
  31.         }
  32.         [HttpPost]
  33.         public FileStreamResult DownloadFile([FromBody] UpdateModel input) {
  34.             string path = AppContext.BaseDirectory + "files\" + input.name;
  35.             FileStream fileStream = new FileStream(path, FileMode.Open);
  36.             return new FileStreamResult(fileStream, "application/octet-stream");
  37.         }
  38.     }
  39. }
复制代码
实现效果

只有服务端其实没什么演示的,这里先看一下更新的效果吧。


代码解析
就只介绍下控制器中的三个方法吧,Index其实没什么用,就是用来做个测试,证明服务是通的;GetUpdateFiles用来比对版本号,获取需要更新的文件(这里用到了Linq To Xml 来解析xml文件,之前文章没写过这个方式,后面再补下);DownloadFile就是用来下载文件的了。
到此这篇关于详解C# WinForm如何实现自动更新程序的文章就介绍到这了,更多相关C# WinForm自动更新程序内容请搜索中国红客联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持中国红客联盟!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行