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.mzph.cn/news/609665.shtml

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

相关文章

AI人工智能虚拟现实行业发展分析

AI人工智能和虚拟现实是当今科技领域最受关注和研究的两个领域。这两项技术的迅速发展给各行各业带来了巨大的变革和机遇。在过去的几年里&#xff0c;AI和虚拟现实已经取得了显著的进展&#xff0c;并且有着广阔的发展前景。 AI人工智能作为一种模拟人类智能的技术&#xff0…

openEuler22.0.3安装oracle11.2.0.4报错总结

openEuler是CentOS8系列魔改来的 1.xstart无法打开报错x11拒绝转义 yum install *x11* vi /etc/ssh/sshd_config X11Forwarding yes systemctl restart sshd 2.执行runinstaller报错,无论是直接无法打开界面报错: when installed in the jdk 1.2 Linux 还是打开界面报错: no o…

探索检索增强生成(RAG)技术的无限可能:Vector+KG RAG、Self-RAG、多向量检索器多模态RAG集成

探索检索增强生成&#xff08;RAG&#xff09;技术的无限可能&#xff1a;VectorKG RAG、Self-RAG、多向量检索器多模态RAG集成 由于 RAG 的整体思路是首先将文本切分成不同的组块&#xff0c;然后存储到向量数据库中。在实际使用时&#xff0c;将计算用户的问题和文本块的相似…

c++学习:智能指针的底层作用原理+用法

目录 智能指针作用原理 作用 原理 模仿int*类型的智能指针 模仿所有类型的智能指针&#xff08;模板&#xff09; 共享智能指针类 思考&#xff1b;如果多个智能指针同时指向同一个堆空间&#xff0c;怎么只执行一次析构函数进行释放空间 &#xff08;共享智能指针类&…

在VS Code中安装Copilot与安装其他扩展的方法一样,只需简单几步

GitHub Copilot是由OpenAI和GitHub开发的人工智能工具。它的目的是通过自动完成代码来帮助开发人员使用集成开发环境&#xff08;IDE&#xff09;&#xff0c;如Visual Studio Code。它目前仅作为技术预览版提供&#xff0c;因此只有在候补名单上被认可的用户才能访问它。对于用…

Redis:原理速成+项目实战——Redis实战8(基于Redis的分布式锁及优化)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战7&#xff08;优惠券秒杀细节解决超卖、一人一单问题&#xff09; &#x1f4d…

Spark与Cassandra的集成与数据存储

Apache Spark和Apache Cassandra是大数据领域中两个重要的工具&#xff0c;用于数据处理和分布式数据存储。本文将深入探讨如何在Spark中集成Cassandra&#xff0c;并演示如何将Spark数据存储到Cassandra中。将提供丰富的示例代码&#xff0c;以帮助大家更好地理解这一集成过程…

Nginx配置反向代理实例一

Mac 安装Nginx教程 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 反向代理实例一实现的效果 在浏览器地址栏输入www.testproxy.com, 跳转到系统Tomcat主页面。 反向代理准备工作 第一步&#xff1a;在系统的 hosts 文件进行ip和域名对应关系的配置。 …

【办公类-19-01】20240108图书统计登记表制作(23个班级)EXCEL复制表格并合并表格

背景需求&#xff1a; 制作一个EXCEL模板&#xff0c;每个班级的班主任统计 班级图书量&#xff08;一个孩子10本&#xff0c;最多35个孩子350本&#xff09; EXCEL模板 1.0版本&#xff1a; 将这个模板制作N份——每班一份 项目:班级图书统计表 核心:一个EXCEL模板批量生成…

Android block quick OnClick event,simple implement,Kotlin

Android block quick OnClick event&#xff0c;simple implement&#xff0c;Kotlin var time 0Lview?.setOnClickListener {val now System.currentTimeMillis()if (now - time > 300) {Log.d("fly", "正常点击")} else {Log.d("fly", &…

Android BUG 之 Error: Activity class {} does not exist

项目场景&#xff1a; 更换包名&#xff0c;运行报错 问题描述 原因分析&#xff1a; 在替换包名的时候要确认&#xff0c;配置文件跟build中的保持一致&#xff0c;在更换后还要将旧包的缓存数据清理掉 解决方案&#xff1a; 1 替换后删除 app 下的build 文件夹 2 Rebuild Pr…

Python-抖音无法拒绝的表白代码【附源码】

一个无法被拒绝的表白代码 运行效果&#xff1a; 一&#xff1a;主程序&#xff1a; import sys import cfg import random import pygame from tkinter import Tk, messagebox Function:按钮类 Initial Args:--x, y: 按钮左上角坐标--width, height: 按钮宽高--text: 按钮显…

gem5学习(10):创建一个简单的配置脚本——Creating a simple configuration script

目录 一、gem5 configuration scripts 1、An aside on SimObjects 二、Creating a config file 1、导入m5库和SimObjects 2、创建模拟系统 3、设置系统时钟 4、设置内存模拟方式 5、创建CPU 6、创建系统级内存总线 7、连接请求-响应端口 &#xff08;1&#xff09;A…

【项目管理】CMMI-风险与机会管理过程

1、文档结构 2、风险与机会概率 风险与机会概率指的是风险与机会实际发生的可能性。可以用自然语言术语来映射数字概率范围。下表列出了七段概率分级中自然语言术语和数字概率范围映射关系。注意&#xff0c;用来计算的概率值等于概率范围的中间值取整。有了映射表格的帮助&am…

计算机视觉技术-区域卷积神经网络(R-CNN)

区域卷积神经网络&#xff08;region-based CNN或regions with CNN features&#xff0c;R-CNN&#xff09; (Girshick et al., 2014)也是将深度模型应用于目标检测的开创性工作之一。 本节将介绍R-CNN及其一系列改进方法&#xff1a;快速的R-CNN&#xff08;Fast R-CNN&#x…

Unity之摄像机

一、摄像机类型 1.1 透视摄像机 透视摄像机有近大远小的效果&#xff0c;与我们在现实中看到的效果相同。所以当两个同样大小的物体到摄像机的距离不同时我们看到的大小也会不同。Unity的3D项目中默认使用的就是透视摄像机。 1.2 正交摄像机 正交摄像机没有近大远小的效果&am…

在 Flutter 中创建圆角图像和圆形图像有多少种方法?

使用 Container 、 ClipRRect 、 CircleAvatar 、 Card 和 PhysicalModel 实现具有视觉吸引力的图像效果。 在 Flutter 应用 UI 设计中&#xff0c;圆形图像是常见的视觉元素。本博客探讨了使用不同技术实现圆形图像效果的各种方法。无论是使用网络图像、本地文件还是资源&…

【MYSQL】MYSQL 的学习教程(十三)之 MySQL的加锁规则

1. MySQL 加锁全局视角 MySQL 分成了 Server 层和存储引擎两部分&#xff0c;每当执行一个查询时&#xff0c;Server 层负责生成执行计划&#xff0c;然后交给存储引擎去执行。其整个过程可以这样描述&#xff1a; Server 层向 Innodb 获取到扫描区间的第 1 条记录Innodb 通过…

从网页连接socket服务器和I/O

1.i/o InputStream和InputStreamReader是Java I/O类库中的两个关键类&#xff0c;用于处理字节流。它们的主要区别在于它们处理数据的方式。 InputStream: InputStream是用于读取字节流的抽象类。它是所有字节输入流类的父类。InputStream的子类可以从不同的数据源读取字节&…

rime中州韵小狼毫 随机数 随机码 电脑信息 滤镜

在输入法中支持生成GUID&#xff0c;或者随机数&#xff0c;随机字符&#xff0c;获取自身电脑信息&#xff0c;这将是一个非常酷的功能。 先睹为快 本文所分享滤镜&#xff0c;主要用于生成一些动态的信息词条&#xff0c;效果如下&#x1f447;&#xff1a; GUID.lua GU…