详解C# WinForm如何实现自动更新程序
作者:Csharp小记 时间:2022-03-04 02:19:29
前言
在C/S这种模式中,自动更新程序就显得尤为重要,它不像B/S模式,直接发布到服务器上,浏览器点个刷新就可以了。由于涉及到客户端文件,所以必然需要把相应的文件下载下来。这个其实比较常见,我们常用的微信、QQ等,也都是这个操作。
自动更新程序也分为客户端和服务端两部分,客户端就是用来下载的一个小程序,服务端就是供客户端调用下载接口等操作。
这里第一步先将服务端代码写出来,逻辑比较简单,使用xml文件分别存储各个文件的名称以及版本号(每次需要更新的时候,将需要更新的文件上传到服务器后,同步增加一下xml文件中对应的版本号)。然后比对客户端传进来的文件版本,若服务端版本比较高,则加入到下载列表中。客户端再循环调用下载列表中的文件进行下载更新。
开发环境
.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");
}
}
}
实现效果
只有服务端其实没什么演示的,这里先看一下更新的效果吧。
代码解析
就只介绍下控制器中的三个方法吧,Index其实没什么用,就是用来做个测试,证明服务是通的;GetUpdateFiles用来比对版本号,获取需要更新的文件(这里用到了Linq To Xml 来解析xml文件,之前文章没写过这个方式,后面再补下);DownloadFile就是用来下载文件的了。
来源:https://mp.weixin.qq.com/s/2Az8-7q2txktpGnhv6vmvw
标签:C#,WinForm,更新,程序
0
投稿
猜你喜欢
Java中Collections.sort的使用
2022-08-20 04:31:49
谈谈Android的三种网络通信方式
2023-04-19 17:28:47
详解Java使用Jsch与sftp服务器实现ssh免密登录
2023-11-24 18:34:18
VS2019 找不到资产文件 “xxxx\\obj\\project.assets.json”运行NuGet包还原以生成此文件(解决方案)
2021-08-25 10:41:05
Spring Cloud Hystrix异常处理方法详解
2022-05-29 06:20:12
htmlcleaner使用方法及xpath语法初探
2023-04-11 07:14:06
jenkins+Maven从SVN上构建项目的方法
2022-07-09 04:42:37
Spring Boot整合Kafka教程详解
2023-06-14 06:02:54
JPA多数据源分布式事务处理方案
2023-08-09 03:50:06
Android编程之DatePicker和TimePicke简单时间监听用法分析
2022-07-04 00:42:24
详解使用Spring Cloud Consul实现服务的注册和发现
2023-06-08 03:46:23
Java多线程之Worker Thread模式
2021-06-11 12:11:51
浅谈Java基准性能测试之JMH
2023-01-25 13:17:40
利用C#实现绘制出地球旋转效果
2022-10-01 14:21:27
Java中的这些骚操作你不能不知道!!!
2022-07-08 12:28:14
Mybatis-plus配置分页插件返回统一结果集
2022-05-27 19:15:06
Spring Boot将项目打包成war包的操作方法
2022-01-02 22:30:50
C# WinForm实现图片浏览器
2022-04-12 23:28:00
SpringDataJpa如何使用union多表分页条件查询
2023-05-16 04:28:49
asp.net core 使用 tensorflowjs实现 face recognition的源代码
2022-11-16 22:14:38