winform程序更新

  1. 更新程序和主程序是分开的,得在做一个exe可执行更新程序。
  2. 主程序在登陆时判断是否需要更新。

    我这边判断方式是直接在配置文件里面设置版本号,然后和服务器上面的版本对比,低于服务器版本就更新程序。

   
//该文件配置在app.config里面
  <!-- 发布前修改版本号 -->

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <appSettings>

   <add key="version" value="1.1.6" />

</appSettings>
</configuration>

  获取配置文件信息,前几章随笔里面有提到。

  

          Version now_v = new Version(strval);//当前版本
                Version load_v = new Version(model.version.ToString());//历史版本
                if (now_v < load_v && MessageBox.Show("检查到新版本,是否更新?", "Update", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {   
                    //更新(调用更新的exe)返回新版本路径
                    string fileName = Application.StartupPath + @"\ClientUpdate.exe";
                    Process p = new Process();
                    p.StartInfo.UseShellExecute = false;
                    p.StartInfo.RedirectStandardOutput = true;
                    p.StartInfo.FileName = fileName;
                    p.StartInfo.CreateNoWindow = true;
                    p.StartInfo.Arguments = now_v + " " + load_v + " " + cn.showVersion()+" "+ model.download.ToString();//参数以空格分隔,如果某个参数为空,可以传入””
                    p.Start();
                    System.Environment.Exit(System.Environment.ExitCode);   //结束主线程
                }

  3.接下来是更新程序的代码部分

    

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                String[] CmdArgs = System.Environment.GetCommandLineArgs();
                if (CmdArgs.Length > 1)
                {
                    
                    //参数0是它本身的路径
                    String arg0 = CmdArgs[0].ToString();//程序路径
                    String arg1 = CmdArgs[1].ToString();//旧版本号
                    String arg2 = CmdArgs[2].ToString();//新版本号
                    String arg3 = CmdArgs[3].ToString();//更新版本
                    String arg4 = CmdArgs[4].ToString();//版本地址

                    //更新
                    lab_version.Text = arg2;

                    this.Text = arg3 + "更新";
                    UpdateDownLoad(arg4);//

                    listBox1.Items.Add("更新信息");
                    foreach (var item in CmdArgs)
                    {
                        listBox1.Items.Add(item.ToString());
                    }

                    label6.Text = "完成更新";
                    button1.Visible = true;


                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
           
        }

 /// <summary>
        /// 更新
        /// </summary>
        /// <param name="verStr"></param>
        private void UpdateDownLoad(string verStr)
        {
            WebClient wc = new WebClient();
            wc.DownloadProgressChanged += wc_DownloadProgressChanged;
            wc.DownloadFileAsync(new Uri(verStr), "../"+ZipHelper.zipFileFullName);//要下载文件的路径,下载之后的命名
        }

        void wc_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)
        {
            Action act = () =>
            {
                this.progressBar1.Value = e.ProgressPercentage;
                this.label1.Text = e.ProgressPercentage + "%";

            };
            this.Invoke(act);

            if (e.ProgressPercentage == 100)
            {
                //下载完成之后开始覆盖

                ZipHelper.Unzip();//调用解压的类

                this.button1.Enabled = true;

            }
        }

        public delegate void ChangeBarDel(System.Net.DownloadProgressChangedEventArgs e);

        /// <summary>
        /// 完成更新之后再次打开主程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
            string fileName = Application.StartupPath + @"\GoldenTax.exe";
            Process p = new Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.FileName = fileName;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            System.Environment.Exit(System.Environment.ExitCode);   //结束主线程
        }
    }

  4.解压类

class ZipHelper
    {

        public static string zipFileFullName = "Update.rar";
        public static void Unzip()
        {
            try
            {
                string _appPath = new DirectoryInfo(Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName).Parent.FullName;

                string s7z = _appPath + @"\7-Zip\7z.exe";
                System.Diagnostics.Process pNew = new System.Diagnostics.Process();
                pNew.StartInfo.FileName = s7z;
                pNew.StartInfo.Arguments = string.Format(" x \"{0}\\{1}\" -y -o\"{0}\"", _appPath + "/../", zipFileFullName);
                //x "1" -y -o"2" 这段7z命令的意思: x是解压的意思 "{0}"的位置写要解压文件路径"{1}"这个1的位置写要解压的文件名 -y是覆盖的意思 -o是要解压的位置
                pNew.Start();
                //等待完成
                pNew.WaitForExit();
                //删除压缩包
                File.Delete(_appPath + @"/../" + zipFileFullName);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            
        }

    }

  

猜你喜欢

转载自www.cnblogs.com/aj407blogs/p/9781655.html