详解C# WinForm如何实现自动更新程序

作者:Csharp小记 时间:2022-03-04 02:19:29 

前言

在C/S这种模式中,自动更新程序就显得尤为重要,它不像B/S模式,直接发布到服务器上,浏览器点个刷新就可以了。由于涉及到客户端文件,所以必然需要把相应的文件下载下来。这个其实比较常见,我们常用的微信、QQ等,也都是这个操作。

自动更新程序也分为客户端和服务端两部分,客户端就是用来下载的一个小程序,服务端就是供客户端调用下载接口等操作。

这里第一步先将服务端代码写出来,逻辑比较简单,使用xml文件分别存储各个文件的名称以及版本号(每次需要更新的时候,将需要更新的文件上传到服务器后,同步增加一下xml文件中对应的版本号)。然后比对客户端传进来的文件版本,若服务端版本比较高,则加入到下载列表中。客户端再循环调用下载列表中的文件进行下载更新。

详解C# WinForm如何实现自动更新程序

开发环境

.NET Core 3.1

开发工具

 Visual Studio 2019

实现代码

//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");
       }

}
}

实现效果

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

详解C# WinForm如何实现自动更新程序

代码解析

就只介绍下控制器中的三个方法吧,Index其实没什么用,就是用来做个测试,证明服务是通的;GetUpdateFiles用来比对版本号,获取需要更新的文件(这里用到了Linq To Xml 来解析xml文件,之前文章没写过这个方式,后面再补下);DownloadFile就是用来下载文件的了。

来源:https://mp.weixin.qq.com/s/2Az8-7q2txktpGnhv6vmvw

标签:C#,WinForm,更新,程序
0
投稿

猜你喜欢

  • Spring boot创建自定义starter的完整步骤

    2023-05-08 08:08:53
  • Android开发之关于项目

    2023-05-08 23:38:24
  • Java中对List集合的常用操作详解

    2023-05-02 23:52:47
  • java图搜索算法之DFS与BFS详解

    2022-08-15 15:48:57
  • MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)

    2023-11-29 05:02:37
  • Java安全之Tomcat6 Filter内存马问题

    2022-11-20 07:29:23
  • Java 实战项目锤炼之小区物业管理系统的实现流程

    2021-07-17 09:24:01
  • Android广播实现App开机自启动

    2023-01-06 14:54:44
  • Android Studio实现简易计算器App (Java语言版)

    2023-08-02 01:05:39
  • Android webView字体突然变小的原因及解决

    2022-01-02 23:39:08
  • springboot操作静态资源文件的方法

    2022-07-13 06:29:11
  • SpringBoot整合Mybatis实现CRUD

    2022-01-10 09:26:45
  • Java实现五子棋(附详细源码)

    2023-10-19 15:20:54
  • Android SQLite基本用法详解

    2023-07-02 05:14:58
  • Sprint Boot 集成MongoDB的操作方法

    2022-11-13 07:10:37
  • Android中的SQL查询语句LIKE绑定参数问题解决办法(sqlite数据库)

    2023-09-12 14:04:06
  • springboot扩展MVC的方法

    2023-12-15 14:19:05
  • 基于list stream: reduce的使用实例

    2021-07-21 06:54:52
  • Java如何实现压缩文件与解压缩zip文件

    2022-01-28 09:14:00
  • Servlet3.0学习总结之基于Servlet3.0的文件上传实例

    2023-09-02 01:51:33
  • asp之家 软件编程 m.aspxhome.com