当前位置: 首页 > news >正文

WinForm、Wpf自动升级 AutoUpdater.NET

Github

AutoUpdater.NET

目录

一、IIS部署 更新站点

二、创建Winform


一、IIS部署 更新站点

IIS默认站点目录下创建 目录 Downloads、Updates

Updates目录创建文件 UpdateLog.html、AutoUpdaterStarter.xml

UpdateLog.html:

<html><body><h1>UpDate</h1></body></html>

 AutoUpdaterStarter.xml:

url节点 为下载更新的地址 http://127.0.0.1/Downloads/fr.zip

<?xml version='1.0' encoding="UTF-8"?>
<item><!--在版本标记之间提供应用程序的最新版本。版本必须为X.X.X.X格式。--><version>1.0.0.2</version><!--在url标签之间提供最新版本安装程序文件或zip文件的url。自动更新。NET下载这里提供的文件,并在用户按下Update按钮时安装它。--><url>http://127.0.0.1/Downloads/fr.zip</url><!--在changelog标记之间提供应用程序更改日志的URL。如果你不提供变更日志的URL,那么更新对话框将不会显示变更日志。--><changelog>http://127.0.0.1/Updates/UpdateLog.html</changelog><!--如果你不想让用户跳过这个版本,可以将其设置为true。这将忽略“稍后提醒”和“跳过”选项,并在更新对话框中隐藏“稍后提醒”和“跳过”按钮。--><!--mandatory mode="2">true</mandatory --><!--可以在强制元素上提供minVersion属性。当您提供该选项时,只有当安装的应用程序版本小于您在这里指定的最小版本时才会触发强制选项。--><!--mandatory minVersion="1.2.0.0">true</mandatory --><!--args(可选):您可以在这个标记之间为安装程序提供命令行参数。您可以在命令行参数中包含%path%,它将被当前正在执行的应用程序所在目录的path所取代。--><!--mandatory args="xxxxx">false</mandatory --><!--提供更新文件的校验和。如果你做这个autotoupater。NET将在执行更新过程之前比较下载文件的校验和,以检查文件的完整性。您可以在校验和标记中提供algorithm属性,以指定应该使用哪个算法来生成下载文件的校验和。目前支持MD5、SHA1、SHA256、SHA384和SHA512。--><!--checksum algorithm="MD5">Update file Checksum</checksum -->
</item>

二、创建Winform

netcore 3.1 + Winform 

nuget安装包

Autoupdater.NET.Official        --版本1.8.0

 2.1创建MainForm

http://127.0.0.1/Updates/AutoUpdaterStarter.xml 为IIS站点更新配置文件

检查版本

    public partial class MainForm : Form{public MainForm(){InitializeComponent();Assembly assembly = Assembly.GetEntryAssembly();label1.Text = $"{assembly.GetName().Version}";//显示版本号AutoUpdatorHelper.Start("http://127.0.0.1/Updates/AutoUpdaterStarter.xml", this);}private void button1_Click(object sender, EventArgs e){AutoUpdater.Start("http://127.0.0.1/Updates/AutoUpdaterStarter.xml");//手动更新}public class AutoUpdatorHelper{/// <summary>/// 自动更新/// </summary>/// <param name="serverPath"></param>/// <param name="synchronizeInvoke"></param>public static void Start(string serverPath, ISynchronizeInvoke synchronizeInvoke){#region 每隔60秒检查一次更新(判断依据是AssemblyInfo中的版本和xml文件的版本是否一致,如果服务器xml文件的版本大于AssemblyInfo中的版本则触发CheckForUpdateEvent)System.Timers.Timer timer = new System.Timers.Timer{Interval = 60 * 1000,//毫秒SynchronizingObject = synchronizeInvoke};timer.Elapsed += (object sender, ElapsedEventArgs e) =>{AutoUpdater.Start(serverPath, Assembly.GetExecutingAssembly());};timer.Start();#endregionAutoUpdater.LetUserSelectRemindLater = true;AutoUpdater.RemindLaterTimeSpan = RemindLaterFormat.Minutes;AutoUpdater.RemindLaterAt = 1;//若您不想在更新表单上显示“跳过”按钮,那个么只需在上面的代码中添加以下行即可。AutoUpdater.ShowSkipButton = false;//如果要同步检查更新,请在启动更新之前将Synchronous设置为true,如下所示。AutoUpdater.Synchronous = true;//若你们不想在更新表单上显示“以后提醒”按钮,那个么只需在上面的代码中添加以下一行即可。AutoUpdater.ShowRemindLaterButton = false;//如果要忽略先前设置的“以后提醒”和“跳过”设置,则可以将“强制”属性设置为true。它还将隐藏“跳过”和“稍后提醒”按钮。如果在代码中将强制设置为true,那么XML文件中的强制值将被忽略。AutoUpdater.Mandatory = false;//您可以通过添加以下代码来打开错误报告。如果执行此自动更新程序。NET将显示错误消息,如果没有可用的更新或无法从web服务器获取XML文件。AutoUpdater.ReportErrors = true;//如果服务器xml文件的版本大于AssemblyInfo中的版本则触发CheckForUpdateEventAutoUpdater.CheckForUpdateEvent += (args) =>{if (args.Error == null){//检测到有可用的更新if (args.IsUpdateAvailable){DialogResult dialogResult;if (args.Mandatory.Value){dialogResult =MessageBox.Show($@"当前有一个新版本{args.CurrentVersion}可用.你正在使用版本{args.InstalledVersion}.点击确认开始更新", @"更新可用",MessageBoxButtons.OK,MessageBoxIcon.Information);}else{dialogResult =MessageBox.Show($@"当前有一个新版本{args.CurrentVersion}可用.你正在使用版本{args.InstalledVersion}.确认要更新吗?", @"更新可用",MessageBoxButtons.YesNo,MessageBoxIcon.Information);}if (dialogResult.Equals(DialogResult.Yes) || dialogResult.Equals(DialogResult.OK)){try{//触发更新下载if (AutoUpdater.DownloadUpdate(args)){Application.Exit();}}catch (Exception exception){MessageBox.Show(exception.Message, exception.GetType().ToString(), MessageBoxButtons.OK,MessageBoxIcon.Error);}}}else{MessageBox.Show($@"当前为最新新版本", @"更新可用",MessageBoxButtons.OK,MessageBoxIcon.Information);}}else{if (args.Error is WebException){MessageBox.Show(@"连接更新服务器失败,请检查网络连接.",@"更新检查失败", MessageBoxButtons.OK, MessageBoxIcon.Error);}else{MessageBox.Show(args.Error.Message,args.Error.GetType().ToString(), MessageBoxButtons.OK,MessageBoxIcon.Error);}}};}}}

 2.2打包

winfrom生成文件添加到压缩文件 fr.zip,复制到IIS站点Downloads目录下

 

2.3更新

 手动更新

 自动更新从版本1.0.0.1 更新到1.0.0.2 

相关文章:

WinForm、Wpf自动升级 AutoUpdater.NET

Github AutoUpdater.NET 目录 一、IIS部署 更新站点 二、创建Winform 一、IIS部署 更新站点 IIS默认站点目录下创建 目录 Downloads、Updates Updates目录创建文件 UpdateLog.html、AutoUpdaterStarter.xml UpdateLog.html&#xff1a; <html><body><h1…...

GPU不够用:语言模型的分布式挑战

引言 随着深度学习技术的飞速发展,大规模语言模型(LLM)在各种NLP任务中取得了令人瞩目的成绩。然而,这些模型的大小和复杂度也不断增加,给部署和应用带来了诸多挑战。特别是在单个GPU或服务器的内存容量有限的情况下,如何高效地利用分布式计算资源成为了一个亟待解决的问…...

深入理解Redis中的渐进式Rehash技术

1. 引言 Redis是一款高性能的键值存储系统,被广泛应用于缓存、队列、计数器等场景,因其快速、稳定的特性备受开发者青睐。在Redis的背后,有着许多复杂的数据结构和算法支撑着其高效运行,而其中之一就是Rehash操作。 Rehash是Redis中的一个关键操作,负责在数据量增加时对…...

数据结构 栈和队列 力扣例题AC——代码以及思路记录

20. 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应…...

管理类联考--复试--英文面试--各校英文面试内容

文章目录 北京地区北京大学中国人民大学北京交通大学北京航空航天大学北方工业大学北京林业大学北京语言大学中央财经大学对外经济贸易大学首都经济贸易大学华北电力大学中国矿业大学中国石油大学北京国家会计学院中国财政科学院研究院北京理工大学北京工商大学中国农业大学 湖…...

Android修行手册-Chaquopy中opencv、numpy的初步应用

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…...

VBA将当前打开的表格生成PDF图片

前言 VBA将当前的表格存储成PDF文件进行存储 代码 Sub ExportToPDF()Dim FilePath As StringDim FileName As StringDim ExportRange As Range 设置导出文件路径及名称FilePath "D:\Users\"FileName "ExportedPDF" 设置导出区域范围Set ExportRange Ra…...

解锁AI大模型秘籍:未来科技的前沿探索

在当今这个技术高速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了我们生活中不可或缺的一部分。从简单的个人助手到复杂的数据分析和决策制定&#xff0c;AI的应用范围日益扩大&#xff0c;其目的是为了让我们的生活变得更加智能化。本文旨在探讨AI如何…...

一文带你了解MySQL之B+树索引的原理

前言 学完前面我们讲解了InnoDB数据页的7个组成部分&#xff0c;知道了各个数据页可以组成一个双向链表&#xff0c;而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表&#xff0c;每个数据页都会为存储在它里边儿的记录生成一个页目录&#xff0c;在通过主键查…...

【Vue】npm run build 打包报错:请在[.env.local]中填入key后方可使用...

报错如下 根目录添加 .env.local 文件 .env.local &#xff1a;本地运行下的配置文件 配置&#xff1a;VUE_GITHUB_USER_NAME 及 VUE_APP_SECRET_KEY 原因...

中国电子学会2020年06月真题C语言软件编程等级考试三级(含详细解析答案)

中国电子学会考评中心历届真题&#xff08;含解析答案&#xff09; C语言软件编程等级考试三级 2020年06月 编程题五道 总分:100分一、最接近的分数&#xff08;20分&#xff09; 分母不超过N且小于A/B的最大最简分数是多少? 时间限制: 1000ms 内存限制: 65536kb 输入…...

WPF的DataGrid自动生成中文列头

直接将一个对象集合绑定到DataGrid上面&#xff0c;设置自动生成列AutoGenerateColumns"True"&#xff0c;DataGrid会自动根据对象类的属性生成对应的列 示例类对象&#xff1a; public class DataModel{public int Id { get; set; }public string Name { get; set;…...

CSS【详解】居中对齐 (水平居中 vs 垂直居中)

水平居中 内部块级元素的宽度要小于容器(父元素) 方案一&#xff1a;文本居中对齐&#xff08;内联元素&#xff09; 限制条件&#xff1a;仅用于内联元素 display:inline 和 display: inline-block; 给容器添加样式 text-align:center<!DOCTYPE html> <html lang&q…...

【排序算法】基数排序

一&#xff1a;基本概念 1.1 基数排序(桶排序)介绍 基数排序&#xff08;radix sort&#xff09;属于“分配式排序”&#xff08;distribution sort&#xff09;&#xff0c;又称“桶子法”&#xff08;bucket sort&#xff09;或bin sort&#xff0c;顾名思义&#xff0c;它是…...

解释存储过程和函数的区别,以及它们在MySQL中的用途。如何创建和使用存储过程和函数?

解释存储过程和函数的区别&#xff0c;以及它们在MySQL中的用途。 存储过程和函数在MySQL中的区别及用途 区别&#xff1a; 返回值&#xff1a; 函数&#xff1a;必须有一个返回值&#xff0c;这可以是一个标量值或一个表。如果没有明确的RETURN语句&#xff0c;函数将返回N…...

【GPU驱动开发】-GPU架构简介

前言 不必害怕未知&#xff0c;无需恐惧犯错&#xff0c;做一个Creator&#xff01; GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理单元&#xff09;是一种专门用于处理图形和并行计算的处理器。GPU系统架构通常包括硬件和软件层面的组件。 一、总体流程 应…...

m位数问题(c++题解)

题目描述 考官只给两个整数n和m&#xff08;1 < n < 8&#xff0c;1< m <5&#xff09;&#xff0c;要求选手从1,2,…,n中取出m个数字&#xff0c;组成一个m位整数&#xff0c;统计所有的m位整数中一共有多少个素数。 如n3,m2时&#xff0c;符合条件的整数有&…...

洛谷P1331海战

题目背景 在峰会期间&#xff0c;武装部队得处于高度戒备。警察将监视每一条大街&#xff0c;军队将保卫建筑物&#xff0c;领空将布满了 F-2003 飞机。 此外&#xff0c;巡洋船只和舰队将被派去保护海岸线。不幸的是&#xff0c;因为种种原因&#xff0c;国防海军部仅有很少…...

如何利用Flutter来写后端 服务端应用

前言 Flutter是谷歌推出的一款跨平台开发框架&#xff0c;现在属于此领域star最多的框架&#xff0c;其被广泛应用于构建前台界面&#xff0c;但或许很少人知道&#xff0c;他也可以写后端应用。 本文主角 flutter非常著名的getx库推出的get server jonataslaw/get_server:…...

数据页和缓存页(BufferPool)

1. 数据页&#xff08;dataPage&#xff09; 什么是数据页&#xff1f; 数据页是 MySQL 存储引擎在磁盘和内存之间传输数据的基本单位&#xff0c;默认大小为16KB。 数据页的结构&#xff1a; 表头&#xff1a;储存与页相关的元信息&#xff0c;比如&#xff0c;页号&#…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...