编程语言
首页 > 编程语言> > C# winfom自动更新

C# winfom自动更新

作者:互联网

之前写过一个winform在线更新的文章,使用ClickOnce发布方式,但是在实际运行的过程中,有些dll文件缺失导致部分功能无法使用,现在介绍另外一个方法,使用代码更新。

实现思路:

所有的在线更新都是比对版本号,再进行程序更新;使用代码也是一样的思路,

1、在iis上部署网站,存储正式运行程序的压缩包,以及版本文件

2、编写升级软件,获取当前配置下的版本,与iis上的版本文件中的版本号进行比对,版本文件低时,就进行压缩包的下载

3、下载完成后,进行解压,然后运行exe程序,并关闭升级程序

直接附代码:

1、程序配置文件(在iis对应的目录下创建 updates.json 文件)

{
"latestversion": "3.0.3",
"downloadurl":"http://127.0.0.1:8091/FD3_WcsClient.zip",
"changelog": "更改日志",
"mandatory": true
}

2.、新建实体类,对应服务器中的 updates.json 文件

    /// <summary>
    /// 更新信息
    /// </summary>
    public class UpdateEntity
    {

        /// <summary>
        /// 提供更新的版本号
        /// </summary>
        public string latestversion { get; set; }

        /// <summary>
        /// 更新包的下载路径,,这里将需要更新的文件压缩成zip文件
        /// </summary>
        public string downloadurl { get; set; }

        /// <summary>
        /// 更新日志
        /// </summary>
        public string changelog { get; set; }

        /// <summary>
        /// 是否是强制更新
        /// </summary>
        public bool mandatory { get; set; }
    }

3、附窗体截图(中间为进度条 progressBar控件)

 

 4、主程序文件

using ICSharpCode.SharpZipLib.Zip;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace OnlineUpdateDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //-当前版本号
        private string NowVersion;
        //-解压到的目录
        private string InstallPath;
        //-程序启用地址
        private string StartPath;


        private UpdateEntity updateEntity = null;

        private void Form1_Load(object sender, EventArgs e)
        {
            //获取当前版本号
            NowVersion = System.Configuration.ConfigurationManager.AppSettings["Version"];
            //获取解压到的目录
            InstallPath = System.Configuration.ConfigurationManager.AppSettings["InstallPath"];
            //获取程序启用地址
            StartPath = System.Configuration.ConfigurationManager.AppSettings["StartPath"];

            //获取更新配置参数内容
            string UpdateEntityUrl = System.Configuration.ConfigurationManager.AppSettings["UpdateEntityUrl"];
            string updateJson = getHtml(UpdateEntityUrl);
            updateEntity = JsonConvert.DeserializeObject<UpdateEntity>(updateJson);

            //显示版本号
            this.label_NowVersion.Text = NowVersion;
            this.label_NextVersion.Text = updateEntity.latestversion;

            if (string.Compare(updateEntity.latestversion, NowVersion) > 0)
            {
                label_message.Text = "有新版本";

                //是否强制更新
                if (updateEntity.mandatory)
                {
                    Btn_Next_Click(null, null);
                }
            }
            else
            {
                label_message.Text = "没有更新版本了";

                //是否强制更新
                if (updateEntity.mandatory)
                {
                    //启动软件
                    ShowLogin();
                }
            }
        }

        /// <summary>
        /// 开始升级按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Next_Click(object sender, EventArgs e)
        {
            //判断值的有效性
            if (string.IsNullOrEmpty(NowVersion)) return;
            if (updateEntity == null) return;

            //下载程序文件到指定的目录下
            try
            {
                WebClient wc = new WebClient();
                wc.DownloadProgressChanged += Wc_DownloadProgressChanged;
                Uri uri = new Uri(updateEntity.downloadurl);

                if (!Directory.Exists(InstallPath))
                {
                    Directory.CreateDirectory(InstallPath);
                }
                wc.DownloadFileAsync(uri, InstallPath + "FD3_WcsClient.zip");
            }
            catch (Exception er)
            {
                MessageBox.Show("下载失败:" + er.Message);
            }
        }

        /// <summary>
        /// 退出程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Cancel_Click(object sender, EventArgs e)
        {
            this.Close();
            this.Dispose();
        }

        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Login_Click(object sender, EventArgs e)
        {
            ShowLogin();
        }

        private void Wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            Action act = () =>
            {
                this.progressBar1.Value = e.ProgressPercentage;
                label_message.Text = "正在下载.....";
            };
            this.Invoke(act);

            //下载完成后解压并覆盖
            if (e.ProgressPercentage == 100)
            {
                label_message.Text = "正在解压.....";

                try
                {

                    //压缩包路径
                    string zipFileName = InstallPath + "FD3_WcsClient.zip";
                    //解压路径
                    string targetDirectory = InstallPath;

                    var result = Compress(targetDirectory, zipFileName, "");
                    if (result == "Success!")
                    {
                        progressBar1.Value = 100;
                        this.label_message.Text = "更新完成";

                        //删除压缩包
                        //File.Delete(zipFileName);

                        //更新配置文件的信息
                        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                        config.AppSettings.Settings["Version"].Value = updateEntity.latestversion;
                        config.Save(ConfigurationSaveMode.Full);
                        ConfigurationManager.RefreshSection("Version");

                        //启动软件
                        ShowLogin();
                    }
                    else
                    {
                        MessageBox.Show("更新失败:" + result);
                        this.Close();
                    }

                }
                catch (Exception)
                {
                    throw;
                }
            }
        }

        /// <summary>
        /// 通过ip获取json数据信息
        /// </summary>
        /// <param name="url">网址</param>
        /// <returns></returns>
        public string getHtml(string url)
        {
            try
            {
                string pageHtml = "";

                //获取或设置用于向Internet资源的请求进行身份验证的网络凭据
                WebClient MyWebClient = new WebClient();

                //从指定网站下载数据
                Byte[] pageData = MyWebClient.DownloadData(url);
                MemoryStream ms = new MemoryStream(pageData);
                using (StreamReader sr = new StreamReader(ms, Encoding.UTF8))
                {
                    pageHtml = sr.ReadLine();
                }
                return pageHtml;
            }
            catch (Exception)
            {
                MessageBox.Show("网络连接失败");
                throw;
            }
        }

        /// <summary>
        /// 解压Zip
        /// </summary>
        /// <param name="DirPath">解压后存放路径</param>
        /// <param name="ZipPath">Zip的存放路径</param>
        /// <param name="ZipPWD">解压密码(null代表无密码)</param>
        /// <returns></returns>
        public string Compress(string DirPath, string ZipPath, string ZipPWD)
        {
            string state = "Fail!";
            if (!Directory.Exists(DirPath)) return state;
            if (!File.Exists(ZipPath)) return state;
            try
            {
                FastZip fastZip = new FastZip();
                fastZip.ExtractZip(ZipPath, DirPath, "");
                state = "Success!";
            }
            catch (Exception ex)
            {
                state += "," + ex.Message;
            }
            return state;
        }

        /// <summary>
        /// 打开wcs程序
        /// </summary>
        public void ShowLogin()
        {
            //启动软件
            System.Diagnostics.Process.Start(StartPath);
            GC.Collect();
            Application.Exit();
        }

       
    }
}

5、配置文件内容

    <appSettings>
        <!--当前版本号-->
        <add key="Version" value="3.0.2" />
        <!--程序集版本配置信息-->
        <add key="UpdateEntityUrl" value="http://192.168.31.2:8091/updates.json" />
        <!--解压到的目录-->
        <add key="InstallPath" value="D:/WCS_Project/" />
        <!--程序启用地址-->
        <add key="StartPath" value="D:/WCS_Project/福鼎物流控制系统.exe" />

    </appSettings>

 

  

标签:string,C#,System,updateEntity,private,自动更新,using,public,winfom
来源: https://www.cnblogs.com/wangshunyun/p/16463258.html