自动更新(自动升级)组件分享

原文:自动更新(自动升级)组件分享

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

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

    2.加入更新提示。

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

    4.加入了皮肤。

   按照国际惯例,先上图:

    

 

  

原理简介

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

 Web服务器端的配置文件:

<?xml version="1.0" encoding="utf-8"?>
<updateFiles>
  <file path="SCADASetupWix.msi" url="http://rj-stone:82/Content/UploadFiles/SCADASetupWix.msi" lastver="1.1.1.0" size="16142" needRestar="false"></file>
</updateFiles>

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

客服端的配置文件:

<?xml version="1.0" encoding="utf-8"?>
<Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Enabled>true</Enabled>
  <ServerUrl>http://rj-stone:82/Content/UploadFiles/AutoupdateService.xml</ServerUrl>
  <UpdateFileList>
    <LocalFile path="SCADASetupWix.msi" lastver="1.1.1.0" size="16142" />
  </UpdateFileList>
</Config>

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

方法调用

 1.IAutoUpdater 接口

 public interface IAutoUpdater
    {
        /// <summary>
        /// Updates this instance.
        /// </summary>
        void Update();

        /// <summary>
        /// Infoes the update.弹出右下角提示框
        /// </summary>
        void InfoUpdate();
        /// <summary>
        /// Gets or sets the config.
        /// </summary>
        /// <value>The config.</value>
        Config Config { get; set; }
        /// <summary>
        /// Rolls the back.
        /// </summary>
        void RollBack();
        /// <summary>
        /// Checks the registry.检查安装版本
        /// </summary>
        /// <returns>System.String.</returns>
        string CheckRegistry();
        /// <summary>
        /// Determines whether [has new version].
        /// </summary>
        /// <returns><c>true</c> if [has new version]; otherwise, <c>false</c>.</returns>
        UpdateResultType HasNewVersion();
        /// <summary>
        /// Runs the installer.直接安装
        /// </summary>
        void RunInstaller();
        /// <summary>
        /// Gets the loaded version.
        /// </summary>
        /// <returns>System.String.</returns>
        string GetLoadedVersion();
        /// <summary>
        /// Gets the size of the loaded.
        /// </summary>
        /// <returns>System.String.</returns>
        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文件夹中的文件

        /// <summary>
        /// 安装已下载的版本
        /// </summary>
        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" };
        }

        /// <summary>
        /// 读取本地config,安装版本信息
        /// </summary>
        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);
            }
        }

        /// <summary>
        /// 初始化
        /// </summary>
        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这个函数,将检测结果分为了三类,一个是远程有新版本,一个是最新版本已经下载,一个是当前已经是最新版本。来给出不同的提示。下面的部分是托盘里面的程序。

 

百度云下载地址:http://pan.baidu.com/s/1c03qM4K 

 参考博客:http://www.cnblogs.com/KnightsWarrior/archive/2010/10/20/1856255.html 

 希望对你有帮助~

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

    

时间: 2024-09-26 12:26:58

自动更新(自动升级)组件分享的相关文章

win7系统使用自带“自动更新”功能升级win10的方法

  win7系统使用自带"自动更新"功能升级win10的方法 1.点击右下角白色窗口图标,弹出此界面.点击"好的,准备好后通知我"进入下一界面; 2.开始更新后,开始等待; 3.远初使用8M网络,整个升级过程越1小时; 4.整个准备过程约半小时; 5.进入此界面后,点击"接受,开始安装"即可进入安装界面;

Win7系统禁止Adobe Flash Player插件自动更新方法分享

给各位Flash软件的使用者们来详细的解析分享一下Win7系统禁止Adobe Flash Player插件自动更新的方法. 办法分享: Adobe Flash Player这款优秀的浏览器的插件,使得各大视频网站都对它进行支持,下载了这个adobe flash插件之后,有时候安装立刻就要结束了,却会出现安装flash player失败的情况 在使用浏览器观看视频的时候,我们都会遇到这样一个事情,浏览器上方弹出Adobe Flash Player安装的提示.这款优秀的浏览器的插件,使得各大视频网站

App Store关闭自动更新方法详解

给各位iPhone手机的使用者们来详细的解析分享一下App Store关闭自动更新的方法. 方法分享: 1.首先我们在界面打开[设置]选项;   2.在设置列表中,找到[iTunes Store与App Store]一栏,点击进入;   3.接着在列表里的自动下载的项目下,点击关闭[更新]选项.   好了,以上的信息就是小编给各位iPhone的这一款手机的使用者们带来的详细的App Store关闭自动更新的方法解析分享的全部内容了,各位看到这里的iPhone手机使用者们,相信你们现在那是非常的清

asp.net自动更新组件分享

一. 摘要 前两天在博客上发布了一篇英文的自动更新组件文章Release a AutoUpdater tool,那么在这篇文章中,我们也对其功能进行一些简单说明,这个组件非常简单,所以大家可以下载进行一些改进.众所周知,对于一般的软件开发,在开始的时候都会有一个技术选型的阶段,最大的选型就是首先要确定是选择Client/Server模式还是Browser/Server模式.综合而论:两者各有优劣,在很多方面都不能被对方互相取代,如在适用Internet.维护工作量等方面,B/S比C/S要强很多:

自动更新组件分享

一. 摘要 前两天在博客上发布了一篇英文的自动更新组件文章Release a AutoUpdater tool,那么在这篇文章中,我们也对其功能进行一些简单说明,这个组件非常简单,所以大家可以下载进行一些改进.众所周知,对于一般的软件开发,在开始的时候都会有一个技术选型的阶段,最大的选型就是首先要确定是选择Client/Server模式还是Browser/Server模式.综合而论:两者各有优劣,在很多方面都不能被对方互相取代,如在适用Internet.维护工作量等方面,B/S比C/S要强很多:

asp.net自动更新组件分享_实用技巧

一. 摘要 前两天在博客上发布了一篇英文的自动更新组件文章Release a AutoUpdater tool,那么在这篇文章中,我们也对其功能进行一些简单说明,这个组件非常简单,所以大家可以下载进行一些改进.众所周知,对于一般的软件开发,在开始的时候都会有一个技术选型的阶段,最大的选型就是首先要确定是选择Client/Server模式还是Browser/Server模式.综合而论:两者各有优劣,在很多方面都不能被对方互相取代,如在适用Internet.维护工作量等方面,B/S比C/S要强很多:

一起谈.NET技术,自动更新组件分享

一. 摘要 前两天在博客上发布了一篇英文的自动更新组件文章Release a AutoUpdater tool,那么在这篇文章中,我们也对其功能进行一些简单说明,这个组件非常简单,所以大家可以下载进行一些改进.众所周知,对于一般的软件开发,在开始的时候都会有一个技术选型的阶段,最大的选型就是首先要确定是选择Client/Server模式还是Browser/Server模式.综合而论:两者各有优劣,在很多方面都不能被对方互相取代,如在适用Internet.维护工作量等方面,B/S比C/S要强很多:

Android:友盟的自动更新组件

又好又专业的服务能帮开发者省很多时间.一开始做项目也准备自己来统计数据.自己做自动更新,随着使用友盟服务的时间增加,渐渐放弃了这种想法,转而研究如何更充分的使用,这里分享一下使用自动更新组件的心得. 一.缺少res导致不能升级的问题 由于缺少了解,官网文档也没用提醒,仅仅拷贝了SDK的jar到工程里,一直不知道到底升级功能是否已经实现,关键是也不报错!今天又拿出来测试了一下,监听了一下UmengUpdateListener接口,发现客户端已经检测到了更新,但是没用弹出更新的对话框,然后就注意到了

【Android】友盟的自动更新组件

前言 又好又专业的服务能帮开发者省很多时间.一开始做项目也准备自己来统计数据.自己做自动更新,随着使用友盟服务的时间增加,渐渐放弃了这种想法,转而研究如何更充分的使用,这里分享一下使用自动更新组件的心得.   声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com  正文 一.缺少res导致不能升级的问题 由于缺少了解,官网文档也没用提醒,仅仅拷贝了SDK的jar到工程里,一直不知道到底升