C#如何实现Winform自动升级程序

技术C#如何实现Winform自动升级程序这篇文章给大家分享的是有关C#如何实现Winform自动升级程序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。开发第三方工具包新建一个WinForm项

本文讲述的是C#如何实现Winform的自动升级程序。我觉得边肖很实用,就和大家分享一下作为参考。让我们跟着边肖看一看。

探索

第三方工具包

创建一个名为SumUpdater的新WinForm项目。下图显示了整个项目的目录。

C#如何实现Winform自动升级程序

在升级程序中,我们需要检查版本信息对比。我在后台使用TXT文件中的JSON数据,下载后需要解压ZIP文件,所以需要参考第三方程序Newtonsoft。Json和DotNetZip .

在引用中用鼠标左键选择管理NuGet包。

C#如何实现Winform自动升级程序

搜索牛顿英尺。用于安装的Json和DotNetZip。

C#如何实现Winform自动升级程序

主接口

将主窗体重命名为MainForm.cs,然后向界面添加两个控件,一个标签和一个progressbar。

C#如何实现Winform自动升级程序

然后重写主窗口的构造函数。

公共主窗体(字符串服务器IP,int服务器端口,string _callBackExeName,字符串标题,int oldversioncode)

增加了五个参数:服务器的IP地址、端口号、升级后要运行的程序名称、标题信息和当前版本号。

app.config

在本地配置文件中添加几个项目来设置服务器的IP地址、端口号、升级完成后要调用的EXE程序以及当前版本号。

C#如何实现Winform自动升级程序

然后添加参数读取Program.cs启动项中的信息,然后传递给主窗体。

静态空主()

{

尝试

{

申请。enablevisualstyle();

申请。setcompatiblextrenderingdefault(false);

string ServerIP=configuration manager。AppSettings[' ServerIP '];

int serverPort=int。解析(配置管理器。AppSettings[' ServerPort ']);

nbsp;          string callBackExeName = ConfigurationManager.AppSettings["CallbackExeName"];
                string title = ConfigurationManager.AppSettings["Title"];
                int VersionCode = int.Parse(ConfigurationManager.AppSettings ["Version"]);

                MainForm form = new MainForm(serverIP, serverPort, callBackExeName, title, VersionCode);

                Application.Run(form);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

C#如何实现Winform自动升级程序

检测并下载更新 Updater.cs

与服务器的网络通讯我们用的是WebClient方式

这个类里主要的两个方法GetUpdaterInfo()和DownLoadUpGrade(string url)

       /// <summary>
        /// 检测升级信息
        /// </summary>
        /// <param name="geturl"></param>
        /// <param name="downurl"></param>
        /// <returns></returns>
        public void GetUpdaterInfo()
        {
            info = new CUpdInfo();
          
            _client = new WebClient();

           //获取检测升级的字符串  _checkurl为地址

            string json = _client.DownloadString(_checkurl);

           //序列化json

            info = SerializationHelper.Deserialize<CUpdInfo>(json, 0);
            //判断服务器上的版本号如果大于本地版本号,执行DownLoadUpGrade(),参数是info.appdownloadurl下载地址

           if (info.versionCode > _oldversioncode)
            {
                DownLoadUpGrade(info.appdownloadurl);
            }
            else
            {
                _lbltext.Text = "当前为最新版本,无需升级!";
                //等待500毫秒后直接启动原程序
                Thread.Sleep(1500);
                UpdaterOver.StartApp(_appFileName);
            }

      }

        /// <summary>
        /// 下载升级文件
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public void DownLoadUpGrade(string url)
        {
            _client = new WebClient();
            if (_client.IsBusy)
            {
                _client.CancelAsync();
            }
            _client.DownloadProgressChanged +=
                new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
            _client.DownloadFileCompleted += new AsyncCompletedEventHandler(webClient_DownloadFileCompleted);

            //开始下载
            _client.DownloadFileAsync(new Uri(url), _downfilename);
        }

        /// <summary>
        /// 下载进度条
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            _progressBar.Value = e.ProgressPercentage;
            _lbltext.Text = $"正在下载文件,完成进度{e.BytesReceived}/{e.TotalBytesToReceive}";
        }

        /// <summary>
        /// 下载完成后的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void webClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                _lbltext.Text = "下载被取消!";
            }
            else
            {
                _lbltext.Text = "下载完成!";
                try
                {
                    Thread.Sleep(1000);
                    UpdaterOver.StartOver(_downfilename, _appDirPath, info.versionCode, _appFileName);
                }
                catch (Exception ex)
                {
                    _lbltext.Text = ex.Message;
                }
            }
        }

下载完成 UpdaterOver.cs

        /// <summary>
        ///
        /// </summary>
        /// <param name="zipfile"></param>
        /// <param name="destpath"></param>
        public static void StartOver(string zipfile, string destpath, int versioncode, string appfile)
        {
            //解压文件到指定目录
            ZipHelper.ZipHelper.UnZipFile(zipfile, destpath, true);
            //成功后修改本地版本信息
            UpdateVersion(versioncode);
            //重新启动源程序
            if (appfile != "")
            {
                StartApp(appfile);
            }
        }

下载完后的事件,首先解压ZIP替换文件

然后修改本地的版本号信息

最后再重新启动原程序

感谢各位的阅读!关于“C#如何实现Winform自动升级程序”这篇文章就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/128600.html

(0)

相关推荐

  • Python如何实现列表映射后的平均值

    技术Python如何实现列表映射后的平均值这篇文章主要介绍了Python如何实现列表映射后的平均值,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、ave

    攻略 2021年11月11日
  • JVM堆外内存泄漏故障排查的示例分析

    技术JVM堆外内存泄漏故障排查的示例分析本篇文章为大家展示了JVM堆外内存泄漏故障排查的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 前言记录一次线上JVM堆外内存泄漏

    攻略 2021年10月23日
  • php7如何将字符串转为数组

    技术php7如何将字符串转为数组这篇文章主要介绍php7如何将字符串转为数组,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 转换方法:1、用str_split(),语法

    攻略 2021年11月7日
  • 微信免单,周末微信支付怎么怎么能够免单

    技术微信免单,周末微信支付怎么怎么能够免单微信支付在春节期间推出摇一摇赢免单活动,意思就是如果你用微信支付就有机会获得免单奖励的,比如你在网上用微信支付买了一个月的qq音乐会员8元,用微信支付后会出现一个摇一摇获得免单机

    生活 2021年10月20日
  • JS页面模板化有哪些

    技术JS页面模板化有哪些这篇文章主要介绍“JS页面模板化有哪些”,在日常操作中,相信很多人在JS页面模板化有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS页面模板化有哪些”的疑惑有

    攻略 2021年11月18日
  • 心形线,如何用几何画板画出笛卡尔心形线

    技术心形线,如何用几何画板画出笛卡尔心形线1心形线、新建参数。右键绘图区空白处,“新建参数”,标签为a,数值为4,单位“无”。
    2、快捷键“Ctrl+G”,调出绘制新函数编辑器。点“方程”,选极坐标方程。在编辑

    生活 2021年10月30日