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

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

前言

在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就是用来下载文件的了。

到此这篇关于详解C# WinForm如何实现自动更新程序的文章就介绍到这了,更多相关C# WinForm自动更新程序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c# Winform 程序自动更新实现方法

    Winform程序自动更新我也是第一次做,网上找了自动更新的源码,后来又根据在网上看到的一些方法,自己试了很久,最终还是有写错误,所以花了钱让别人帮忙调试成功的,下面是我自己捣腾出来的,方便大家借鉴,如果有什么错误的地方欢迎指正. 1.由于我是通过服务器的IIS发布自动更新的,更新之前先手动把程序复制到IIS服务器的目录下面,做一些更改,客户端才能正常自动更新.所以第一步是不熟IIS服务器(本人系统windows8): 按照上面的方式,选了之后点确定,系统会自动添加这些内容,然后: 网站建立好了

  • C#实现热更新服务器程序的具体过程

    目录 热更新有没有解决一些开发问题的痛点 热更新实现原理 具体的实现过程 总结 热更新有没有解决一些开发问题的痛点 其实首先探讨的一个问题就是,热更服务器程序到底有没有必要出现,或者说有没有适用场景,我个人觉得吧还是有的. 如果真的可以在不重启应用的情况下实现逻辑的更新,这未尝对于一些紧急的情况不是一个好消息,尤其是一些小团队.小创业公司刚起步的时候,技术测试流程和人力不会像成规模的企业那样完善,那么带来的问题就是上线后的应用.游戏可能会存在一些Bug,如果不严重还好,可以留到下一个迭代更新统一

  • c# 如何实现自动更新程序

    主要功能介绍 实现文件的自动更新.主要功能: 支持整包完全更新,即客户端只需输入一个服务器地址,即可下载所有文件. 支持增量更新,即只更新指定的某几个文件. 支持自动更新程序的更新 更新界面如图: 客户端 main方法入口 /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { //在主程序中 更新替换自动升级程序 //ReplaceAutoUpgrade(); bool isEnte

  • 用c# 自动更新程序

    作者:冰封一夏 出处:http://www.cnblogs.com/bfyx/ HZHControls官网:http://www.hzhcontrols.com 首先看获取和更新的接口 更新程序Program.cs using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Threading.Tasks; us

  • C# Winform 自动更新程序实例详解

    本文实例为大家分享了C# Winform 自动更新程序,供大家参考,具体内容如下 第一步:检查更新 检查更新其实无非就是去比较更新包的版本和本地软件版本,如果高则更新.低则不更新.怎么获取版本号方法很多,本案例是获取软件的配置文件. private bool CheckUpdate() { bool result = false; try { string Cfg = TxtRead(exePath "\\Config.txt"); ConfigLocal = JsonConvert.

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

    目录 前言 开发环境 开发工具 实现代码 实现效果 前言 在C/S这种模式中,自动更新程序就显得尤为重要,它不像B/S模式,直接发布到服务器上,浏览器点个刷新就可以了.由于涉及到客户端文件,所以必然需要把相应的文件下载下来.这个其实比较常见,我们常用的微信.QQ等,也都是这个操作. 自动更新程序也分为客户端和服务端两部分,客户端就是用来下载的一个小程序,服务端就是供客户端调用下载接口等操作. 这里第一步先将服务端代码写出来,逻辑比较简单,使用xml文件分别存储各个文件的名称以及版本号(每次需要更

  • 详解如何在Android studio中更新sdk版本和build-tools版本

    一.首先看下Android开发用到的sdk目录: build-tools 保存着一些Android平台相关通用工具,比如adb.和aapt.aidl.dx等文件.  aapt即Android Asset Packaging Tool , 在SDK的build-tools目录下. 该工具可以查看, 创建, 更新ZIP格式的文档附件(zip, jar, apk). 也可将资源文件编译成二进制文件.  Adb 即android debug bridge 管理模拟器和真机的万能工具,ddms 调试环境 

  • 详解MySQL与Spring的自动提交(autocommit)

    1 MySQL的autocommit设置 MySQL默认是开启自动提交的,即每一条DML(增删改)语句都会被作为一个单独的事务进行隐式提交.如果修改为关闭状态,则执行DML语句之后要手动提交 才能生效. 查询当前会话的自动提交是否开启: mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit

  • 详解SpringBoot通用配置文件(不定时更新)

      以下是SpringBoot项目中的常用配置类.jar包坐标等通用配置 pom文件 <!-- --> <!-- 自定义配置文件提示 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true<

  • 详解扩展tk.mybatis的批量更新的功能

    tk.mybatis没有带批量更新的功能,批量更新却是经常使用的,所以需要自己实现. 批量更新网上主要有2种方式:case when方式.foreach方式 但是foreachzhe这种方式效率非常低下,不知道为何那多么帖子在流传,请看我另一个文章. 扩展tk.mybatis的批量更新,采用case when方式,源码干货如下: 首先定义下mapper接口 import org.apache.ibatis.annotations.UpdateProvider; import java.util.

  • 详解通用webpack多页面自动导入方案

    目录 前言 思考 安装glob 创建工具类 getEntry getHtmlWebpackPlugin 二次封装 应用 前言 在之前,我写了一个webpack的模板.在平时我写栗子或者是写几个页面的时候会用到它.当这个模板需要多个页面时需要手动到webpack.config.ts文件中配置entry和HtmlWebpackPlugin,有点麻烦. 思考 我们项目中的页面都是存放在src/pages/*.html中的,我们可以搜索这里文件夹下的html文件我们可以利用node中的glob包中的.s

  • 详解C# winform ListView的基本操作

    组图的加载与导入 图片存放的相对路径/ 与exe存放在一个文件夹 为界面添加图片组–组件 图片下载路径链接:img_jb51.rar // 组图的加载与导入 Dictionary<int, string> dic = new Dictionary<int, string>(); // 保存 序号--文件路径 private void LoadImgList() { string imgPath = @".\img"; // 文件夹路径 if (Directory

  • C# WinForm实现自动更新程序之客户端的示例代码

    目录 前言 开发环境 开发工具 实现代码 实现效果 前言 第二步理论上我们该写客户端了,但是,在此之前,需要先介绍下一些必要的方法以及操作. 写代码还是要尽量的保证通用性,以便以后需要的时候可以拿来稍微改改甚至直接使用.所以在这里我们将自动更新的程序抽象出来,即对于客户端来说,它只包含三个文件(AutoUpdate.dll.AutoUpdate.exe.UpdateList.xml,如果是.NET Framework的话,其实是没有AutoUpdate.dll文件的,就一个exe就足够了.这也是

  • 详解Angular组件数据不能实时更新到视图上的问题

    目录 问题起源 OnPush策略 当前组件或子组件之一触发了事件 总结 问题起源 MainComponent: @Component({ selector: 'main', template: ` <MenuComponent [isReport]="isReport"> </MenuComponent> `, changeDetection:ChangeDetectionStrategy.OnPush }) export class MainComponent

随机推荐