GeneralUpdate2.1.0发布

2022-12-07 18:14:07 浏览数 (1)

How to use it:

Gitee(码云)地址:

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

Nuget地址:

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

GitHub地址:

  • Address:https://github.com/WELL-E/AutoUpdater/tree/autoupdate2
  • Issues:https://github.com/WELL-E/AutoUpdater/issues

1.版本更新2020-8-30

  1. 在新的发布中,GeneralUpdate.Core-2.1.0版本新增断点续传功能。
  2. 在新的发布中,新增了组件 GeneralUpdate.Single-1.0.0,它将为程序带来单例运行功能,防止自动更新程序开启多个。

2.更新流程

1.客户端程序启动,向服务器获取更新信息解析并比对是否需要更新。

2.解析进程传参。例如:本机版本号、最新版本号、下载地址、解压路径、安装路径等。

3.客户端程序启动更新程序(GeneralUpdate),关闭自身(客户端把自己关掉)。

4.自动更新程序(GeneralUpdate)根据传递的更新信息进行, (1)下载、(2)MD5校验、(3)解压、(4)删除更新文件、(5)替换更新文件、(6)关闭更新程序自身、(7)启动客户端。

5.完成更新

3.进程之间相互调用

此段代码来自于msdn

代码语言:javascript复制
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();
        }
    }
}

3.GeneralUpdate.Core-2.1.0使用方式

#region Launch1

代码语言:javascript复制
        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<DefultStrategy>().//注册策略,可自定义更新流程
            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<DefultStrategy>().
        //    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}");
    }

3.GeneralUpdate.Single-1.0.0使用方式

代码语言:javascript复制
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
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<App>.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<App>.Cleanup();
        }
    }

    public bool SignalExternalCommandLineArgs(IList<string> args)
    {
        if (this.MainWindow.WindowState == WindowState.Minimized)
        {
            this.MainWindow.WindowState = WindowState.Normal;
        }
        this.MainWindow.Activate();

        return true;
    }
}

4.问答Q&A

Q1.如果版本迭代多次,跨版本更新,该怎么办呢?

A1:只要不是框架级别的更新都是可以更新的。不管你迭代多少次跨了多少个版本,你把最终的包放到服务器上就行了。这个里面没有涉及到增量更新,所以你更新多了直接把所有的新文件覆盖上去就行了。

Q2.GeneralUpdate是跟客户端是一个整体吗?

A2: 不是,GeneralUpdate是一个独立于客户端的程序。

Q3:能不能增量更新、失败自动回滚、更新本地数据或配置文件?

A3: 目前不能。(该功能已在开发计划当中)。

Q4:GeneralUpdate是如何更新的?

A4: 更新的方式为把本地原有的客户端文件进行覆盖。

0 人点赞