博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自动更新(自动升级)组件分享
阅读量:6083 次
发布时间:2019-06-20

本文共 5895 字,大约阅读时间需要 19 分钟。

原文:

    自从接触安装部署以来就有软件升级的需求,最简单的就是clickonce,但无法做到深入控制,本寄希望于WIX可以自己实现,但现在还没有找到例子。然后才自己实现。 要声明一下,这是在圣殿骑士AutoUpdater基础上改动过来的。基于他分享的精神,我也继续分享。我主要做了以下改动。

    1.加入客服端安装版本和下载版本检测。

    2.加入更新提示。

    3.做了一些异常处理,增加了接口方法。

    4.加入了皮肤。

   按照国际惯例,先上图:

    

 

  

原理简介

  最基本原理还是借助于圣殿骑士大神的原理,通过检测远程和本地的配置文件,来提示和下载,我加入了安装版本和下载版本的检查,来稍微区分了一下。 

 Web服务器端的配置文件:

Autoupdater首先会去获取这个配置文件,看updateFiles中有无更新文件。

客服端的配置文件:

true
http://rj-stone:82/Content/UploadFiles/AutoupdateService.xml

然后和本地的UpdateFileList中的文件进行比对,远程版本新就提示更新。

方法调用

 1.IAutoUpdater 接口

public interface IAutoUpdater    {        ///         /// Updates this instance.        ///         void Update();        ///         /// Infoes the update.弹出右下角提示框        ///         void InfoUpdate();        ///         /// Gets or sets the config.        ///         /// 
The config.
Config Config { get; set; } /// /// Rolls the back. /// void RollBack(); /// /// Checks the registry.检查安装版本 /// ///
System.String.
string CheckRegistry(); /// /// Determines whether [has new version]. /// ///
true
if [has new version]; otherwise,
false
.
UpdateResultType HasNewVersion(); /// /// Runs the installer.直接安装 /// void RunInstaller(); /// /// Gets the loaded version. /// ///
System.String.
string GetLoadedVersion(); /// /// Gets the size of the loaded. /// ///
System.String.
string GetLoadedSize(); }

 上面的接口在AutoUpdater.cs中实现。检测安装版本主要是检测注册表,是安装文件中决定的。也就是读取RegistryKey和RegistryValue

public string CheckRegistry()        {            string version = "0.0.0.0";            var rk = Registry.CurrentUser;            var softversion = rk.OpenSubKey(ConstFile.RegistryKey);            if (softversion != null)            {                version = softversion.GetValue(ConstFile.RegistryValue).ToString();            }            return version;        }

自动安装也是直接去执行,bin目录下UploadFiles文件夹中的文件

///         /// 安装已下载的版本        ///         public void RunInstaller()        {            var path = Path.Combine(GetOldPath(), "UploadFiles");            var app = Path.Combine(path, ConstFile.ROOLBACKFILE);            if (File.Exists(app))            {                RunHelper.RunInstaller(app);            }            else            {                MessageBox.Show("文件不存在", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);            }        }

 其他方法就不一一例举了。大家可以去看源码。

2.调用

using System;

using System.Windows.Forms;
using AutoUpdater.AutoUpdateHelper;

public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();            IniAutoUpdater();        }        private IAutoUpdater _autoUpdater;        Sunisoft.IrisSkin.SkinEngine se;//皮肤        private void Form1_Load(object sender, EventArgs e)        {            CheckLocal();            se = new Sunisoft.IrisSkin.SkinEngine { SkinAllForm = true, SkinFile = @"..\..\skin\EmeraldColor2.ssk" };        }        ///         /// 读取本地config,安装版本信息        ///         private void CheckLocal()        {            //名称            AppLab.Text = ConstFile.ROOLBACKFILE;            //下载版本            loadVersionLab.Text = _autoUpdater.GetLoadedVersion();            //下载大小            LengthLab.Text = _autoUpdater.GetLoadedSize();            //已安装版本            VersionLab.Text = _autoUpdater.CheckRegistry();        }        private void CheckUpdate()        {            var result = _autoUpdater.HasNewVersion();            if (result == UpdateResultType.Remote)            {                TopMost = false;                update();            }            if (result == UpdateResultType.Local)            {                var result1 = MessageBox.Show("当前下载版本已经是最新版本,是否安装?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);                if (result1 == DialogResult.OK)                {                    _autoUpdater.RunInstaller();                }            }            if (result == UpdateResultType.None)            {                MessageBox.Show("安装版本已经是最新版本", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);            }        }        ///         /// 初始化        ///         private void IniAutoUpdater()        {            _autoUpdater = new AutoUpdater.AutoUpdateHelper.AutoUpdater();        }        private void SCADAnotifyIcon_MouseClick(object sender, MouseEventArgs e)        {            if (Visible)            {                Hide();            }            else            {                Show();            }        }        private void openToolStripMenuItem_Click(object sender, EventArgs e)        {            Visible = true;        }        private void CheckUpdateBt_Click(object sender, EventArgs e)        {            CheckUpdate();        }        // 触发安装        private void UpdateBt_Click(object sender, EventArgs e)        {            _autoUpdater.RunInstaller();        }        private void exitToolStripMenuItem_Click(object sender, EventArgs e)        {            SCADAnotifyIcon.Visible = false;            Close();            Application.Exit();        }        private void updateToolStripMenuItem_Click(object sender, EventArgs e)        {            CheckUpdate();        }        private void hideToolStripMenuItem_Click(object sender, EventArgs e)        {            Hide();        }        private void Form1_FormClosing(object sender, FormClosingEventArgs e)        {            e.Cancel = true;            Hide();        }    }

 主要是checkupdate这个函数,将检测结果分为了三类,一个是远程有新版本,一个是最新版本已经下载,一个是当前已经是最新版本。来给出不同的提示。下面的部分是托盘里面的程序。

 

百度云下载地址:

 参考博客:

 希望对你有帮助~

(弱弱的感叹下,博客园的流量不如以前了。能像知乎、雪球、InfoQ那样的社区就好了,不知道大家是否有新的去处)

    

转载地址:http://plzwa.baihongyu.com/

你可能感兴趣的文章
关于HTML5的理解
查看>>
需要学的东西
查看>>
Internet Message Access Protocol --- IMAP协议
查看>>
Linux 获取文件夹下的所有文件
查看>>
对 Sea.js 进行配置(一) seajs.config
查看>>
第六周
查看>>
解释一下 P/NP/NP-Complete/NP-Hard 等问题
查看>>
javafx for android or ios ?
查看>>
微软职位内部推荐-Senior Software Engineer II-Sharepoint
查看>>
sql 字符串操作
查看>>
【转】Android布局优化之ViewStub
查看>>
网络安全管理技术作业-SNMP实验报告
查看>>
根据Uri获取文件的绝对路径
查看>>
Flutter 插件开发:以微信SDK为例
查看>>
.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?...
查看>>
边缘控制平面Ambassador全解读
查看>>
Windows Phone 7 利用计时器DispatcherTimer创建时钟
查看>>
程序员最喜爱的12个Android应用开发框架二(转)
查看>>
vim学习与理解
查看>>
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>