本文共 6934 字,大约阅读时间需要 23 分钟。
转:
Gitee(码云)地址:
Nuget地址:
GitHub地址:
在新的发布中,GeneralUpdate.Core-2.1.0版本新增断点续传功能。
在新的发布中,新增了组件 GeneralUpdate.Single-1.0.0,它将为程序带来单例运行功能,防止自动更新程序开启多个。
1.客户端程序启动,向服务器获取更新信息解析并比对是否需要更新。
2.解析进程传参。例如:本机版本号、最新版本号、下载地址、解压路径、安装路径等。
3.客户端程序启动更新程序(GeneralUpdate),关闭自身(客户端把自己关掉)。
4.自动更新程序(GeneralUpdate)根据传递的更新信息进行, (1)下载、(2)MD5校验、(3)解压、(4)删除更新文件、(5)替换更新文件、(6)关闭更新程序自身、(7)启动客户端。
5.完成更新
此段代码来自于msdn
using System;using System.Diagnostics;using System.ComponentModel;namespace MyProcessSample{ class MyProcess { // Opens the Internet Explorer application. void OpenApplication(string myFavoritesPath) { // Start Internet Explorer. Defaults to the home page. Process.Start("IExplore.exe"); // Display the contents of the favorites folder in the browser. Process.Start(myFavoritesPath); } // Opens urls and .html documents using Internet Explorer. void OpenWithArguments() { // url's are not considered documents. They can only be opened // by passing them as arguments. Process.Start("IExplore.exe", "www.northwindtraders.com"); // Start a Web page using a browser associated with .html and .asp files. Process.Start("IExplore.exe", "C:\myPath\myFile.htm"); Process.Start("IExplore.exe", "C:\myPath\myFile.asp"); } // Uses the ProcessStartInfo class to start new processes, // both in a minimized mode. void OpenWithStartInfo() { ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe"); startInfo.WindowStyle = ProcessWindowStyle.Minimized; Process.Start(startInfo); startInfo.Arguments = "www.northwindtraders.com"; Process.Start(startInfo); } static void Main() { // Get the path that stores favorite links. string myFavoritesPath = Environment.GetFolderPath(Environment.SpecialFolder.Favorites); MyProcess myProcess = new MyProcess(); myProcess.OpenApplication(myFavoritesPath); myProcess.OpenWithArguments(); myProcess.OpenWithStartInfo(); } }}
#region Launch1
args = new string[6] { "0.0.0.0", "1.1.1.1", "https://github.com/WELL-E", "http://192.168.50.225:7000/update.zip", @"E:PlatformPath", "509f0ede227de4a662763a4abe3d8470", }; GeneralUpdateBootstrap bootstrap = new GeneralUpdateBootstrap();//自动更新引导类 bootstrap.DownloadStatistics += OnDownloadStatistics;//下载进度通知事件 bootstrap.ProgressChanged += OnProgressChanged;//更新进度通知事件 bootstrap.Strategy ().//注册策略,可自定义更新流程 Option(UpdateOption.Format, "zip").//指定更新包的格式,目前只支持zip Option(UpdateOption.MainApp, "your application name").//指定更新完成后需要启动的主程序名称不需要加.exe直接写名称即可 Option(UpdateOption.DownloadTimeOut,60).//下载超时时间(单位:秒),如果不指定则默认超时时间为30秒。 RemoteAddress(args).//这里的参数保留了之前的参数数组集合 Launch();//启动更新 #endregion #region Launch2 /* * Launch2 * 新增了第二种启动方式 * 流程: * 1.指定更新地址,https://api.com/GeneralUpdate?version=1.0.0.1 在webapi中传入客户端当前版本号 * 2.如果需要更新api回返回给你所有的更新信息(详情内容参考 /Models/UpdateInfo.cs) * 3.拿到更新信息之后则开始http请求更新包 * 4.下载 * 5.解压 * 6.更新本地文件 * 7.关闭更新程序 * 8.启动配置好主程序 * 更新程序必须跟主程序放在同级目录下 */ //GeneralUpdateBootstrap bootstrap2 = new GeneralUpdateBootstrap(); //bootstrap2.DownloadStatistics += OnDownloadStatistics; //bootstrap2.ProgressChanged += OnProgressChanged; //bootstrap2.Strategy (). // Option(UpdateOption.Format, "zip"). // Option(UpdateOption.MainApp, ""). // Option(UpdateOption.DownloadTimeOut,60).//下载超时时间(单位:秒),如果不指定则默认超时时间为30秒。 // RemoteAddress(@"https://api.com/GeneralUpdate?version=1.0.0.1").//指定更新地址 // Launch(); #endregion private static void OnProgressChanged(object sender, ProgressChangedEventArgs e) { if (e.Type == ProgressType.Updatefile) { var str = $"当前更新第:{e.ProgressValue}个,更新文件总数:{e.TotalSize}"; Console.WriteLine(str); } if (e.Type == ProgressType.Done) { Console.WriteLine("更新完成"); } } private static void OnDownloadStatistics(object sender, DownloadStatisticsEventArgs e) { Console.WriteLine($"下载速度:{e.Speed},剩余时间:{e.Remaining.Minute}:{e.Remaining.Second}"); }
/// /// App.xaml 的交互逻辑/// public partial class App : Application, ISingleInstanceApp{ private const string AppId = "{7F280539-0814-4F9C-95BF-D2BB60023657}"; [STAThread] protected override void OnStartup(StartupEventArgs e) { string[] resultArgs = null; if (e.Args == null || e.Args.Length == 0) { resultArgs = new string[6] { "0.0.0.0", "1.1.1.1", "https://github.com/WELL-E", "http://192.168.50.225:7000/update.zip", @"E:PlatformPath", "509f0ede227de4a662763a4abe3d8470", }; } else { resultArgs = e.Args; } if (resultArgs.Length != 6) return; if (SingleInstance .InitializeAsFirstInstance(AppId)) { var win = new MainWindow(); var vm = new MainViewModel(resultArgs, win.Close); win.DataContext = vm; var application = new App(); application.InitializeComponent(); application.Run(win); SingleInstance .Cleanup(); } } public bool SignalExternalCommandLineArgs(IList args) { if (this.MainWindow.WindowState == WindowState.Minimized) { this.MainWindow.WindowState = WindowState.Normal; } this.MainWindow.Activate(); return true; }}
A1:只要不是框架级别的更新都是可以更新的。 不管你迭代多少次跨了多少个版本,你把最终的包放到服务器上就行了。这个里面没有涉及到增量更新,所以你更新多了直接把所有的新文件覆盖上去就行了。
A2: 不是,GeneralUpdate是一个独立于客户端的程序。
A3: 目前不能。(该功能已在开发计划当中)。
A4: 更新的方式为把本地原有的客户端文件进行覆盖。
转:
转载地址:http://kvkbz.baihongyu.com/