c#自动更新升级工具

c#更新工具,wpf开发,所有windows桌面程序均可使用,基于.net 4.0,最低支持windos xp系统

更新工具优点

  • 使用简单
  • 批量更新
  • 跨版本更新
  • 数据备份
  • 手动还原数据
  • 体积小

程序更新使用效果

在这里插入图片描述

使用简单

只需添加两个类,以及三个路径的指定,就可以从任何地方下载更新包,并解压到主程序目录中,自动启动
在这里插入图片描述
在这里插入图片描述

批量更新

不管你从后台拿到了多少个升级包,都能一次性完成升级(以下升级包为本地测试数据)
在这里插入图片描述

手动还原数据至上一版本

在这里插入图片描述

体积小

依赖少,占用空间少
在这里插入图片描述

如何使用

添加类ClientParameter.cs

    public class ClientParameter{/// <summary>/// 1:MainApp 2:UpdateApp/// </summary>public int AppType { get; set; } = 1;/// <summary>/// 启动程序名称(可以加上相对路径)/// </summary>public string AppName { get; set; }/// <summary>/// 下载的内容放到哪里/// </summary>public string DownLoadPath { get; set; }/// <summary>/// 解压的内容放到哪里/// </summary>public string UnZipPath { get; set; }/// <summary>/// 备份地址/// </summary>public string BackUpPath { get; set; }/// <summary>/// 客户端版本当前/// </summary>public string ClientVersion { get; set; }/// <summary>/// 日志访问地址/// </summary>public string UpdateLogUrl { get; set; }/// <summary>/// 是否修改目标版本(通过修改version.ini的方式统一控制版本)/// </summary>public bool IsUpdateVersion { get; set; } = true;/// <summary>/// 是否是还原版本/// </summary>public bool IsRestore { get; set; } = false;/// <summary>/// 多版本更新/// </summary>public List<UpdateVersion> UpdateVersions { get; set; }}public class UpdateVersion{public UpdateVersion(string version, string url, string name, bool isUpdate = true){Version = version;Url = url;Name = name;IsUpdate = isUpdate;}public UpdateVersion(string version, string url, bool isUpdate = true){Version = version;Url = url;IsUpdate = isUpdate;}/// <summary>/// 更新的包名/// </summary>public string Name { get; set; }/// <summary>/// 更新的版本/// </summary>public string Version { get; set; }/// <summary>/// 包地址/// </summary>public string Url { get; set; }/// <summary>/// 是否更新/// </summary>public bool IsUpdate { get; set; }}

添加类UpdateUtil.cs

    public static class UpdateUtil{#region API函数声明-必须放在类中[DllImport("kernel32")]//返回0表示失败,非0为成功private static extern long WritePrivateProfileString(string section, string key,string val, string filePath);[DllImport("kernel32")]//返回取得字符串缓冲区的长度private static extern long GetPrivateProfileString(string section, string key,string def, StringBuilder retVal, int size, string filePath);#endregionpublic static string Serialize(object obj){if (obj == null) return string.Empty;var json = JsonConvert.SerializeObject(obj);var bytes = Encoding.Default.GetBytes(json);var base64str = Convert.ToBase64String(bytes);return base64str;}public static T Deserialize<T>(string str){var obj = default(T);if (string.IsNullOrEmpty(str)) return obj;try{byte[] bytes = Convert.FromBase64String(str);var json = Encoding.Default.GetString(bytes);var result = JsonConvert.DeserializeObject<T>(json);return result;}catch (Exception){return default;}}#region 写Ini文件/// <summary>/// 将内容写入指定的ini文件中/// </summary>/// <param name="Section">ini文件中的节名</param>/// <param name="Key">ini文件中的键</param>/// <param name="Value">要写入该键所对应的值</param>/// <param name="iniFilePath">ini文件路径</param>/// <returns></returns>public static bool Write(string Section, string Key, string Value, string iniFilePath){if (!File.Exists(iniFilePath)){try{FileStream stream = File.Open(iniFilePath, FileMode.Create, FileAccess.Write);//stream.Seek(0, SeekOrigin.Begin);//stream.SetLength(0); //清空txt文件stream.Dispose();stream.Close();}catch (Exception ex){Console.WriteLine(ex);}}if (File.Exists(iniFilePath)){long OpStation = WritePrivateProfileString(Section, Key, Value, iniFilePath);if (OpStation == 0){return false;}else{return true;}}else{return false;}}#endregion/// <summary>/// 读取ini文件内容的方法/// </summary>/// <param name="Section">ini文件的节名</param>/// <param name="Key">ini文件对应节下的健名</param>/// <param name="NoText">ini文件对应节对应健下无内容时返回的值</param>/// <param name="iniFilePath">该ini文件的路径</param>/// <returns></returns>public static string Read(string Section, string Key, string NoText, string iniFilePath){if (File.Exists(iniFilePath)){StringBuilder temp = new StringBuilder(1024);GetPrivateProfileString(Section, Key, NoText, temp, 1024, iniFilePath);return temp.ToString();}else{return null;}}}

生成的程序项目结构如下
在这里插入图片描述
主程序生成至current文件夹下,更新程序生成至update文件夹下
在这里插入图片描述
在这里插入图片描述
执行更新处添加如下代码

 ClientParameter clientParameter = new ClientParameter {AppName = appName,BackUpPath = backUpPath,DownLoadPath = downLoadPath,//下载包临时存放位置 可默认UnZipPath = unZipPath,//解压文件存放位置,可默认UpdateLogUrl = "",//更新成功后会自动跳转至该路径 为空则不跳转UpdateVersions = new List<UpdateVersion> {new UpdateVersion("1.0.2","http://127.0.0.1:5000/v3.23.12_202312051713.zip"),new UpdateVersion("1.0.3","http://127.0.0.1:5000/Avalonia-11.0.0-preview4.zip"),//new UpdateVersion("1.0.4","http://127.0.0.1:5000/Dragablz-master.zip"),new UpdateVersion("1.0.5","http://127.0.0.1:5000/EChartsSDK-master.zip"),new UpdateVersion("1.0.6","http://127.0.0.1:5000/EChartsNet-master.zip"),//new UpdateVersion("1.0.7","http://127.0.0.1:5000/HandyControl-master.zip"),new UpdateVersion("1.0.8","http://127.0.0.1:5000/Live-Charts-master.zip"),}};string arg = UpdateUtil.Serialize(clientParameter);var path = directInfo.Parent.FullName + @"\download\Cloud.Update.exe";if (File.Exists(path)){Process.Start(path, arg);Process.GetCurrentProcess().Kill();}

关于测试下载环境的搭建

新建 asp.net core webapi 项目

在这里插入图片描述
如同取消勾选
在这里插入图片描述
program.cs添加静态文件支持

         app.UseStaticFiles();

在这里插入图片描述
重新生成代码
在这里插入图片描述
到debug目录下新建wwwroot文件夹
在这里插入图片描述
将用来测试的压缩包放到wwwroot文件夹下,注意以.zip的格式结尾
在这里插入图片描述
回到程序目录双击启动
在这里插入图片描述
在这里插入图片描述
在浏览器输入http://localhost:5000/v3.23.12_202312051713.zip,回车测试下载服务是否正常
在这里插入图片描述
可以看到成功下载了压缩包,至此下载环境搭建完成
在这里插入图片描述
代码地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/234519.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux异常情况,排查处理中

登录客户环境后&#xff0c;发现一个奇怪情况如下图&#xff0c;之前也遇到过&#xff0c;直接fuser -ck /backup操作的话&#xff0c;主机将会重启&#xff0c;因数据库运行中&#xff0c;等待停机维护时间&#xff0c;同时也在想办法不重启的情况下解决该问题 [rootdb ~]# f…

万界星空科技MES系统怎么管理生产?

MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;是一种用于管理和监控生产过程的软件系统。它通常与企业的ERP系统&#xff08;Enterprise Resource Planning&#xff0c;企业资源计划&#xff09;集成&#xff0c;用于实时收集和分析…

浅谈WAF——守护网络安全的无形之盾

随着信息化时代的到来&#xff0c;网络已逐渐融入我们日常生活的方方面面。然而&#xff0c;与此同时&#xff0c;网络安全问题却也如影随形。为此&#xff0c;一种名为“Web应用防火墙”的工具应运而生&#xff0c;简称”WAF”。 WAF是什么&#xff1f; WAF&#xff08;Web …

Docker 存储卷管理

一、存储卷简介 存储卷是一种方便、灵活、高效的Docker容器内数据存储方式。存储卷可以在容器内的不同进程间共享数据&#xff0c;并且可以在容器之间共享和重用。 二、存储卷的优点 可以在容器之间共享和重用&#xff0c;避免了在不同容器之间复制数据的繁琐。对数据卷的修…

【Flink精讲】Flink数据延迟处理

面试题&#xff1a;Flink数据延迟怎么处理&#xff1f; 将迟到数据直接丢弃【默认方案】将迟到数据收集起来另外处理&#xff08;旁路输出&#xff09;重新激活已经关闭的窗口并重新计算以修正结果&#xff08;Lateness&#xff09; Flink数据延迟处理方案 用一个案例说明三…

leetcode 每日一题 2024年01月09日 字符串中的额外字符

题目 字符串中的额外字符 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串&#xff0c;每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。 请你采取最优策略分割 s &…

Qt5插件开发入门+示例

目的 1、为什么用插件 现在大家最讲模块化开发了,怎么算模块化,分成不同的类,分成不同的文件夹,高内聚,低耦合,这个当然算是。 从高层次讲,它们是在一起的,只是逻辑上的模块化,不是物理上的模块化,或者说不是彻底的模块化,彻底的模块化应该像一个辆自行车一样,车…

2023年阿里云云栖大会:前沿技术发布与未来展望

在2023年的阿里云云栖大会上&#xff0c;我见证了云计算和人工智能领域的又一历史性时刻。这次大会不仅是对未来科技趋势的一次深入探索&#xff0c;更是阿里云技术实力和创新能力的集中展示。 首先&#xff0c;千亿级参数规模的大模型通义千问2.0的发布&#xff0c;无疑将人工…

mysql之导入导出远程备份

文章目录 一、navicat导入导出二、mysqldump命令导入导出2.1导出2.1.1 导出表数据和表结构2.1.2 只导出表结构() 2.2 导入(使用mysqldump导入 包含t _log表的整个数据库 共耗时 20s;)方法一&#xff1a;方法二&#xff1a; 三、LOAD DATA INFILE命令导入导出(只针对单表)设置导…

Java中SpringBoot组件集成接入【Knife4j接口文档(swagger增强)】

Java中SpringBoot组件集成接入【Knife4j接口文档】 1.Knife4j介绍2.maven依赖3.配置类4.常用注解使用1.实体类及属性(@ApiModel和@ApiModelProperty)2.控制类及方法(@Api、@ApiOperation、@ApiImplicitParam、 @ApiResponses)3.@ApiOperationSupport注解未生效的解决方法5.…

2024年01月微软更新Bug 已解决 !Explorer.EXE 提示:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。

前倾概要 近期大量出现如上图问题&#xff0c;杀毒&#xff0c;系统急救箱都没反应&#xff0c;罪魁祸首就是微软更新&#xff01; 点击什么都是&#xff1a;Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。 但软件使用正常&#xff0c;还能通过建立…

渐变登录页

效果演示 实现了一个简单的登录页面的样式和交互效果。 Code <div class"flex"><div class"login color">Login</div><label class"color">Username :</label><input type"text" class"input&…

Python——通过统计图像像素值初步分析图像噪声类型

图像噪声是指图像中不随真实场景变化而变化的随机干扰。噪声会影响图像的质量&#xff0c;因此需要对其进行去噪处理。 目录 一、图像噪声1.1 噪声类型1.2 结合峰度和偏度判断噪声1.2.1 峰度和偏度1.2.2 常见噪声的峰度和偏度 二、代码三、测试结果四、总结 一、图像噪声 图像…

Linux调试------gdb的使用

目录 前言 一、gdb打开可执行程序 二、查看代码与操作断点 1.l 查看代码 2.b 打断点 3.info b 查看断点信息 4.d 删除断点 5.disable 和 enable 断点的禁用与启用 三、调试 1.r 启动调试 2. n 逐过程 3. s 逐语句 4.display显示变量 5.undisplay 取消显…

2024.1.10每日一题

LeetCode 2696.删除字串后的字符串最小长度 2696. 删除子串后的字符串最小长度 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个仅由 大写 英文字符组成的字符串 s 。 你可以对此字符串执行一些操作&#xff0c;在每一步操作中&#xff0c;你可以从 s 中删除 任…

【教学类-45-04】X-Y之间的“三连减加“题(a-b+c=)

作品展示&#xff1a; 背景需求&#xff1a; 【教学类-45-02】X-Y之间的“三连减“题(a-b-c)-CSDN博客文章浏览阅读465次&#xff0c;点赞15次&#xff0c;收藏7次。【教学类-45-02】X-Y之间的"三连减"题(a-b-c)https://blog.csdn.net/reasonsummer/article/details…

Redis 主从、哨兵和分片集群简单介绍

Redis 主从集群架构 单节点 redis 并发能力有上限&#xff0c;要进一步提高 redis 并发能力&#xff0c;就要搭建主从集群&#xff0c;实现读写分离 主从同步原理 Replicaition id&#xff1a;每台 master 机器都一个 repl_id&#xff0c;是数据集的表示&#xff0c;若 salv…

关于OSPF的五种报文类型介绍、OSPF八种状态机变化与报文交互介绍。

4.2.2 路由 OSPF&#xff08;OSPF的5种报文、8种状态机、邻居与邻接的形成&#xff09; 目录 OSPF的5种报文Hello报文报文字段简介 DD/DBD报文DD报文字段简介&#xff08;首个DD报文&#xff09;DD报文字段简介&#xff08;非首个DD报文——携带简要路由信息&#xff09;LSR报文…

FineBI实战项目一(7):每天每小时上架商品个数

1 明确数据分析目标 对所有商品的商家时间进行统计&#xff0c;统计每个小时上架商品的个数 2 创建用于保存数据分析结果的表 create table app_hour_goods(id int primary key auto_increment,daystr varchar(20),hourstr varchar(20),cnt int ); 3 编写SQL语句进行数据分析…

WPS或word中英文字母自动调整大小写,取消自动首字母大写,全部英文单词首字母大小写变换方法

提示&#xff1a;写英文论文时&#xff0c;如何实现英文字母大小写的自动切换&#xff0c;不用再傻傻的一个字母一个字母的编辑了&#xff0c;一篇文章搞定WPS与Word中字母大小写切换 文章目录 一、WPS英文单词大小写自动修改与首字母大写调整英文字母全部由大写变成小写 或 小…