GeneralUpdate实现应用程序更新

c7b09ff2ce1ff4c5df07963378c97e44.png

微软中国MSDN  点击上方蓝字关注我们

大家好,我是本期的实验室研究员——朱震。今天我将通过实验和完整的操作过程,向大家介绍如何基于开源项目GeneralUpdate打造一个能自动升级的客户端应用。接下来就让我们一起到实验室中一探究竟吧!

微软MVP实验室研究员

f5827a1b3ec705762b09ed9e4e2bc2d6.png

9b73b0461c1b7363db4e44d7850dcb22.png

朱震 Juster zhu

GeneralUpdate开源项目作者

Dotnet源计划b站、公众号作者

主要从事客户端领域开发

21045b5eb0582e7f413937b451377a95.png

项目介绍

308c00f535a55331d6b52a039fbe8ace.png

e9ab24366349d3e4216b27d1c4888766.png

GeneralUpdate是基于.net standard开发的一款(c/s应用)自动升级程序。该组件将更新的核心部分抽离出来方便应用于多种项目当中目前适用于wpf,控制台应用,winfrom。目前封装了六个组件功能分别如下:

  • GeneralUpdate.Core:断点续传、逐版本更新、下载超时时间

  • GeneralUpdate.ClientCore:断点续传、逐版本更新、更新组件自更新、便捷启动更新组件

  • GeneralUpdate.AspNetCore:服务端支持更新包下载地址、版本信息等内容

  • GeneralUpdate.Zip:解压更新包、解压进度通知

  • GeneralUpdate.Single:应用程序单例运行

  • GeneralUpdate.Common:组件公共类、方法

以及生成版本信息的数据库结构脚本。

编码实现

35aacb22fba992fc71e49a26165c62f4.png

在讲编码实现之前,可能大家对自动更新流程不太熟悉,这里我整理了一张更新的流程图来为大家讲解:

97cc59f6192a9a40030618541586d115.png

请先记住几个名词,MainApp是公司的产品项目,UpdateApp是独立进程的升级程序,Service是服务器。

(1)Mainapp会向服务器请求UpdateApp更新程序的包(这一步是为了自更新UpdateApp)

(2)如果UpdateApp需要更新则下载更新包(进行MD5加密验证)

(3)不需要更新或更新完成之后都会通过进程通讯打开UpdateApp

(4)UpdateApp启动之后则开始向服务器请求Mainapp的更新包(进行MD5加密验证)

(5)如果有则把更新包下载下来,并把Mainapp更新包里的文件解压并覆盖到本地实现更新

(6)UpdateApp更新完成后则启动Mainapp并关闭自身

大致知道更新流程之后我们来分别看看MainApp、UpdateApp、Service的应用吧。

MainApp

95afc176786753d9b07add0fac98caca.png

大家可以看到在引用GeneralUpdate.ClientCore 的nuget包之后,可以直接按照以上语法直接使用非常方便,基本上你所关注的一些信息都封装在了这些事件里,我们一起来看看封装了那些内容。

MutiDownloadProgressChanged该事件可提供信息,单个或多个更新包的:

  • 当前下载包大小

  • 下载进度

  • 进度百分比

  • 下载的版本信息

  • 当前正在执行的操作(检查版本信息中、正在下载当前版本、更新完成、更新失败)

  • 已下载大小

MutiDownloadStatistics该事件可提供信息:

  • 剩余下载时间

  • 下载速度

OnMutiDownloadCompleted该事件可提供信息:

  • 当前下载的更新包是否下载完成

OnMutiAllDownloadCompleted该事件可提供信息:

  • 这一次如果有多个版本需要更新则会在所有版本更新文件下载完成之后通知

OnMutiDownloadError该事件可提供信息:

  • 下载版本文件过程出现的异常信息

Exception:

  • 整个下载、安装、启动程序的过程任何异常都会通过该事件返回

Config:

  • 进程之间需要传递的内容

Strategy<>:

  • 是开放给开发者扩展的入口,如果更新流程有新的变更则可以继承组件默认自带的DefaultStrategy类进行自定义扩展

LaunchTaskAsync:

  • 启动更新引导类

UpdateApp

这里几乎和上一个组件的功能一样这里简单的看看代码如何应用。

1135338204dc02f0d56273046fc073e4.png

Service

这里我们只需要在IServiceCollection中注入我们实现好的更新逻辑即可。

11cb4bc91a5b4de551f5eb628c4f06c4.png

接下来再看看controller中如何实现。

c239d5d618196c2137e1a2beb7a8dbfe.png

运行效果

de257af1f3725f1efccfbccc7405a877.png

0f315841cdf0c9920a47b8dbedcb6274.png

下载安装

85548c7b70797e6efd99f87c727a6301.png

项目地址:

  • https://github.com/WELL-E/AutoUpdater

  • https://gitee.com/Juster-zhu/GeneralUpdate

Nuget地址:

  • https://www.nuget.org/packages/GeneralUpdate.Common/

  • https://www.nuget.org/packages/GeneralUpdate.ClientCore/

  • https://www.nuget.org/packages/GeneralUpdate.AspNetCore/

  • https://www.nuget.org/packages/GeneralUpdate.Zip/

  • https://www.nuget.org/packages/GeneralUpdate.Single/

  • https://www.nuget.org/packages/GeneralUpdate.Core/

微软最有价值专家(MVP)

ba93d79512230bd071680211a6c13a23.png

微软最有价值专家是微软公司授予第三方技术专业人士的一个全球奖项。28年来,世界各地的技术社区领导者,因其在线上和线下的技术社区中分享专业知识和经验而获得此奖项。

MVP是经过严格挑选的专家团队,他们代表着技术最精湛且最具智慧的人,是对社区投入极大的热情并乐于助人的专家。MVP致力于通过演讲、论坛问答、创建网站、撰写博客、分享视频、开源项目、组织会议等方式来帮助他人,并最大程度地帮助微软技术社区用户使用Microsoft技术。
更多详情请登录官方网站:
https://mvp.microsoft.com/zh-cn

微软MVP,期待你加入

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

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

相关文章

看完数学概念背后的故事,让孩子的数学兴趣激增1000倍!

▲ 点击查看英国著名科学家霍金在撰写《时间简史》的时候&#xff0c;出版商郑重其事地建议道&#xff1a;“你的书里多一条数学公式&#xff0c;就会失去一部分读者。”可见对数理化的害怕&#xff0c;也没有国界&#xff0c;大家都一样。看着满满都是概念和数字的课本&#x…

栈和队列之生成窗口最大值数组

package com.chenyu.zuo.stackAndQueue;import java.util.LinkedList;/*** 题目:有一个整形数组,arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右滑动一个位置。* 例如数组[4,3,5,4,3,3,6,7],窗口的大小为3时;* [4 3 5] 4 3 3 6 7 窗口中最大值为5* 4[ 3…

主存和cache每一块相等_笔记:cpu中的cache(一)

前言&#xff1a;绝大部分内容来源于北京大学的慕课《计算机组成原理》&#xff0c;地址&#xff1a;https://www.coursera.org/learn/jisuanji-zucheng存储体系&#xff08;《深入理解计算机系统》&#xff09;cache是为了解决cpu和内存速度不对等的问题。一&#xff0c;cache…

MATLAB中求矩阵非零元的坐标

MATLAB中求矩阵非零元的坐标&#xff1a; 方法1&#xff1a; indexfind(a); [i,j]ind2sub(size(a),index); disp([i,j])方法2&#xff1a; [i,j]find(a>0|a<0) %列出所有非零元的坐标 [i,j]find(ak) %找出等于k值的矩阵元素的坐标所用函数简介&#xff1a; IND2SUB Mult…

设计模式学习笔记(十七)——Command命令模式

设计模式学习笔记&#xff08;十七&#xff09;——Command命令模式 Command命令模式介绍&#xff1a; Command命令模式是一种对象行为型模式&#xff0c;它主要解决的问题是&#xff1a;在软件构建过程中&#xff0c;“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问…

MAUI中Maui.Graphics.Controls绘制控件

简介Microsoft.Maui.Graphics是一个完全采用C#的iOS&#xff0c;Android&#xff0c;Windows&#xff0c;macOS&#xff0c;Tizen和Linux的跨平台图形库。对于MAUI项目当中绘制的方案是使用不同平台的控件来而非自绘。当然MAUI当中也使用了Microsoft.Maui.Graphics,MAUI Previe…

BGP聚合as-set advertise-map

advertise-map xxx 用来挂汇总路由的&#xff0c;当route-map xxx 中的路由存在时&#xff0c;才会出现汇总路由。否则没有汇总路由只继承advertise-map xxx 中路由的属性当汇总路由携带了多个明细属性&#xff0c;可用advertise-map xxx 来移除某个明细路由的路由属性实验拓扑…

Android之如何解决popupWindow(pw.setFocusable(true))按返回键和menu键退出

先爆照: 问题: 使用过popupWindow的时候,我们为了让其它地方不可点击,我们一般会pw.setFocusable(true),但是当我们这样设置之后,问题出现了,按返回键或者menu菜单键没有反应,这是原因呢? PopupWindow 跟我们的 Activity 不一样,因为我们在构造 PW 的时候往往不是继…

上班骚扰男同事被抓到......

1 不同年代的辞职理由&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 月壤不能种菜太让人失望了▼3 原来&#xff0c;我也努力过▼4 忘了上班还有监控&#xff08;作者来源最右&#xff0c;ID&#xff1a;8943090 &#xff09;▼5 这是台风被黑的最惨的一次&…

mysql8 修改权限_MySQL8修改重置root密码,远程连接权限设置

MySQL8 修改重置root密码这里要单独强调是MySQL8&#xff0c;因为在MySQL 8.04前&#xff0c;执行&#xff1a;SET PASSWORDPASSWORD([新密码]);可行&#xff0c;但是MySQL8.0.4开始&#xff0c;这样默认是不行的。因为之前&#xff0c;MySQL的密码认证插件是“mysql_native_pa…

.NET 6新特性试用 | DateOnly和TimeOnly类型

前言在.NET 6之前&#xff0c;没有方法来直接表示没有时间的日期&#xff08;比如生日&#xff09;或者没有日期的一天中的时间&#xff08;比如闹钟&#xff09;。虽然我们可以使用DateTime类和TimeSpan类来代替&#xff0c;但是实际使用中会存在一些问题&#xff1a;var date…

用wordpress制作网站的总结

在没有自己的网站的时候很像拥有一个属于自己的网站&#xff0c;可以说是自己的一个愿望吧。但是当我真正的运行起来了之后觉得没有多么的兴奋&#xff0c;自己也折腾了几天wordpress,从买域名空间&#xff0c;到安装WP&#xff0c;遇到了一些问题&#xff0c;自己到处搜索答案…

解析super-smack的smack文件

Super-smack是一款强大的数据库压测工具&#xff0c;现在支持mysql和PostgreSQL两种数据库&#xff0c;你可以通过简单的配置文件(.smack)来生成一系列测试环境&#xff1a;测试数据&#xff0c;测试表&#xff1b;在测试的过程中&#xff0c;你可以控制客户端的并发数量以及执…

JSP是不是Java发展史上的一大败笔?

JSP一个年代传奇人物&#xff0c;它的诞生成果了网络的三国鼎立的局势&#xff0c;可是&#xff0c;几年的结构的风烟席卷&#xff0c;让JSP逐渐淡出这个前史舞台&#xff0c;有人不由宣布这样的感叹&#xff0c;JSP是不是Java开展史上的一大败笔呢&#xff1f; 查询样本 让咱们…

Android之使用PopupWindow使用和总结

不废话,先爆照 说明: 那个灰色背景是不能滑动里ListView里面的内容的 第一步:我们需要背景view 下面是我的background.xml文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/t…

Cell发文!施一公科研团队取得重大突破

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;科学网&#xff08;有删减&#xff09;北京时间2020年12月29日凌晨0时&#xff0c;《细胞》&#xff08;Cell&#xff09;发表中科院院士、西湖大学校长施一公课题组的一项新研究。研究首次报道了γ-分泌酶&#xff…

MAUI 跨平台播客应用程序(Conf 2021)

介绍在.NET Conf 2021大会上&#xff0c;微软展示了基于.NET6 跨平台应用程序, 具有ASP.NET Core、Blazor、.NET MAUI、微服务等功能。浏览由 ASP.NET Core 和 Blazor 提供支持的 .NET Podcasts 应用的实时运行版本&#xff1a;https://dotnetpodcasts.azurewebsites.net/项目体…

mysql enum_MySQL数据库中关于ENUM类型的详细解释

MySQL数据库中&#xff0c;因为工作的需求&#xff0c;我们可能会用到ENUM类型&#xff0c;但是由于此类型不是很常用&#xff0c;我们可能对其也不是很了解。没关系&#xff0c;本文我们就对ENUM类型做一些详细的解释&#xff0c;希望能够对您有所帮助。ENUM类型是一个字符串对…

Linux系统新手学习的11点建议

随着Linux应用的扩展许多朋友开始接触Linux&#xff0c;根据学习Windwos的经验往往有一些茫然的感觉&#xff1a;不知从何处开始学起。这里介绍学习Linux的一些建议。 一、从基础开始&#xff1a;常常有些朋友在Linux论坛问一些问题&#xff0c;不过&#xff0c;其中大多数的问…

Android之如何实现通讯录的搜索并且让匹配到的数据变颜色

不废话,先爆照 第一步:实现搜索 已经实现了通讯录功能,但是需要搜索,可以支持中文名字搜索,写入电话号码搜索,还有名字拼音,以及名字第一个字的首字母来搜索,这里介绍名字搜索,然后数据是我们公司TCL(020)所有员工的信息,目前还没有写到后…