IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 关于如何实现自动更新的探索 -> 正文阅读

[开发工具]关于如何实现自动更新的探索

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

出于开发需求,一个由VS2019开发的控制台应用程序,需实现自动更新。


一、三种解决思路


  • VS2019自带的publish
  • VS2019的扩展包setup project
  • 参考他人开发的自动更新组件

二、方法解析


1.publish

VS2019直接对项目进行右键-发布,将文件发布到本地,指定服务器url,然后将文件上传到服务器。

可以实现打开setup.exe自动安装和更新。
但是无法实现自己选择路径,不满足开发需求。

一般默认安装在C:\Users\administrator\AppData\Local\Apps\2.0文件下。


2.setup project

之前有学习并了解过setup project,仅凭借之前的记忆做一下记录。

先在扩展中添加一个扩展程序,然后在解决方案上添加setup project的项目。
然后对这个项目进行一些设置,右键生成便可生成安装包。

要注意的点就是:
可以添加C盘某个位置的卸载程序;
可以通过版本号实现覆盖更新;
重新运行安装程序会提示修复或删除此程序;
或者只能通过控制面板卸载;
可以自定义安装步骤,但是没法添加自己想要在安装时添加的一些对产品的激活等操作(可能是我不会);
可以控制默认安装路径,但是如果这个路径不存在程序好像会崩掉(不太记得了);


3.参考他人开发的自动更新组件

本系统最终选用了此方案。

首先参考了“圣殿骑士”的文章:
自动更新组件分享
但由于“圣殿骑士”大佬的源代码链接已经失效,所以又参考了底下评论217楼
stoneniqiu的文章:
自动更新(自动升级)组件分享
参考stoneniqiu留下的源代码,进行了修改,只留下了三个接口:

  • 判断是否需要更新
  • 更新
  • 回滚

将生成的dll,导入原程序,进行逻辑的写入。


三、 具体实现


1.简述实现逻辑

stoneniqiu提供的源代码为一个winform程序,主程序带有版本显示与用户操作按钮,类库程序AutoUpdater提供dll,但也带有"更新确认"与“下载进度”的winform程序。

但由于winform程序是本人所不需要的,所以对AutoUpdater类库进行修改,同时进行删减,仅实现“判断是否更新”,“更新”,“回滚”三个功能即可。

然后将AutoUpdater类库进行右键生成,将Debug文件夹下的AutoUpdater.dll引入到其他程序,通过下述代码即可实现上述三个功能。

IAutoUpdater autoUpdater = new AutoUpdater.AutoUpdateHelper.AutoUpdater();
autoUpdater.HasNewVersion();
autoUpdater.Update();
autoUpdater.RollBack();

2.版本控制

客户端使用文件AutoUpdater.config,服务器端使用文件AutoupdateService.xml。
服务器端文件的生成参考圣殿骑士文章下的208楼评论,ptangbao提供的代码。
客户端的文件可以参考stoneniqiu的文章。

由于本地AutoUpdater.config文件不一定放在程序Debug路径下,所以提供了默认路径或者指定路径:

public AutoUpdater()
{
    Config = Config.LoadConfig(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,ConstFile.FILENAME));
}
public AutoUpdater(string path)
{
    Config = Config.LoadConfig(Path.Combine(path, ConstFile.FILENAME));
}
IAutoUpdater autoUpdater = new AutoUpdater.AutoUpdateHelper.AutoUpdater();
IAutoUpdater autoUpdater = new AutoUpdater.AutoUpdateHelper.AutoUpdater(path);

3.三种功能解读

HasNewVersion方法首先先得到服务器端AutoupdateService.xml文件中的版本,如果未得到服务器版本(网络问题或者……)则返回false;
再得到本地AutoUpdater.config文件中的版本,并进行版本比较,返回true或false;
如果不需要更新,则程序往下执行,如果需要更新,则先更新则重新执行。

Update方法先得到服务器端AutoupdateService.xml文件中的所有待更新文件。
然后遍历本地AutoUpdater.config文件中的待更新文件,如果服务器端待更新文件中包含本地待更新文件,则进行版本比较,如果需要更新,则将本地待更新文件进行版本替换并暂存入更新列表。
再遍历服务器端AutoupdateService.xml文件中本地文件不存在的待更新文件,存入本地缓存文件与更新列表。
如果更新列表不为空,则执行更新操作。
原更新操作为一个进度显示的winform程序,我修改为了一个类文件,使用OnFormLoad方法激活下载(此方法代码没有深入研究),完成后进行本地文件的版本修改操作,并保存。

RollBack方法为回滚,在update时,需更新的文件会被加上.old的后缀,如果update时报错了,则激活rollBack方法,将.old去掉。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:31:11  更:2022-04-04 12:31:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:34:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码