如何让程序自动更新

如何让程序自动更新

自动更新的软件的目的在于让客户不在为了寻找最新软件花费时间。也不用去到开发商的网站上查找。客户端的软件自动会在程序启动前查找服务器上最新的版本。和自己当前软件的版本比较,如果服务器的是最新版本。客户端则进行自动下载、解压、安装。当然了下载是要有网络的,并且用户可以根据提示去完成操作。再也不用为找不到最新版本的软件而头疼。下面是我的大体思路,已经得到了实现:

1、  写一个webservice,提供一个获取服务器xml中版本的数据的方法。(也可用其他文件格式, 此处举例XML)

2、  在WinForm应用程序启动的时候,首先访问webservice获取服务器的xml中的版本号,然后获取客户端的xml中的版本号。将两个版本号比较,若服务器中的版本号大,则提示提示可以在线更新应用程序。

3、  然后客户端自动下载网络上的RAR压缩包到本机的指定位置,进行自动解压缩。解压缩完毕之后,用进程打开所解压过的exe文件进行软件安装。同时关闭客户端软件所在的进程。

一   web项目中的代码

首先我给大家先展示下我的web项目中的webservice的代码,这里面跟简单,只有一个方法。项目需要发布到IIS上面。

1.1 webservice中的代码

 [STAThread]

        static void Main()

        {

            Application.EnableVisualStyles();

            Application.SetCompatibleTextRenderingDefault(false);

            LoadMath();

        }

        private static void LoadMath()

        {

            //服务器上的版本号

            string NewEdition = string.Empty;

            //应用程序中的版本号

            string OldEdition = string.Empty;

            try

            {

                //获取webservice上的版本号

                myService.WebServiceUpdateSoapClient c = new myService.WebServiceUpdateSoapClient();

                NewEdition = c.GetEdition("clkj_ws");

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

            try

            {

                //获取系统中xml里面存储的版本号

                XDocument document = XDocument.Load("XMLEdition.xml");

                XElement element = document.XPathSelectElement("Content/Project/Edition");

                if (element != null)

                {

                    OldEdition = element.Value.ToString();

                }

            }

            catch (Exception exx)

            {

                MessageBox.Show(exx.Message);

            }

            double newE = double.Parse(NewEdition);

            double oldE = double.Parse(OldEdition);

            //比较两个版本号,判断应用程序是否要更新

            if (newE > oldE)

            {

                //更新程序¨°

                DialogResult dr = MessageBox.Show("发现新的版本是否要更新该软件", "系统提示?", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

                if (dr == DialogResult.OK)

                {

                    //打开下载窗口

                    Application.Run(new DownUpdate ());

                }

                else

                {

                    //若用户取消,打开初始界面

                    Application.Run(new Login());

                }

            }

        }

1.2 xml中的代码

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

<Content>

<Project id="p1">

<Name>test</Name>

<Edition>2.0</Edition>

</Project>

</Content>

二   WinForm项目中的代码

Web项目的代码就只有上面的一点,重点的还是在WinForm中。在WinForm中首先要添加web引用,将上述的webservice访问地址复制过来使用。下面我一步一步来为大家解析吧。

第一步:

2.1 xml中的代码

客户端的代码和服务器断的xml代码大致相同,不同的只用Edition元素里面的值。

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

      <Content>

        <Project id="p1">

          <Name>test</Name>

          <Edition>1.0</Edition>

         </Project>

      </Content>

2.2 Program.cs代码(设置起始页的代码)

在Program.cs(WinForm中设置起始页的地方)这个类中添加代码

 [STAThread]

        static void Main()

        {

            Application.EnableVisualStyles();

            Application.SetCompatibleTextRenderingDefault(false);

            LoadMath();

        }

        private static void LoadMath()

        {

            //服务器上的版本号

            string NewEdition = string.Empty;

            //应用程序中的版本号

            string OldEdition = string.Empty;

            try

            {

                //获取webservice上的版本号

                myService.WebServiceUpdateSoapClient c = new myService.WebServiceUpdateSoapClient();

                NewEdition = c.GetEdition("clkj_ws");

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

            try

            {

                //获取系统中xml里面存储的版本号

                XDocument document = XDocument.Load("XMLEdition.xml");

                XElement element = document.XPathSelectElement("Content/Project/Edition");

                if (element != null)

                {

                    OldEdition = element.Value.ToString();

                }

            }

            catch (Exception exx)

            {

                MessageBox.Show(exx.Message);

            }

            double newE = double.Parse(NewEdition);

            double oldE = double.Parse(OldEdition);

            //比较两个版本号,判断应用程序是否要更新

            if (newE > oldE)

            {

                //更新程序¨°

                DialogResult dr = MessageBox.Show("发现新的版本是否要更新该软件", "系统提示?", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

                if (dr == DialogResult.OK)

                {

                    //打开下载窗口

                    Application.Run(new DownUpdate ());

                }

                else

                {

                    //若用户取消,打开初始界面

                    Application.Run(new Login());

                }

            }

        }

2.3 Main.cs(登录后的主界面)的代码

这个可以省略,没有实际意义

2.4 DownUpdate.cs(更新页面)的代码

界面显示如下图

自动更新代码如下(其中更新按钮的name为btnDown,安装按钮的name为btnInstall):

//debug目录,用于存放压缩文件t
        string path = Application.StartupPath;
        public DownExe()
        {
            InitializeComponent();
        }

        private void DownExe_Load(object sender, EventArgs e)
        {
            btnInstall.Enabled = false;
        }

        //下载文件、自动解压缩文件
        private void btnDown_Click(object sender, EventArgs e)
        {
            //自动下载压缩包,并且解压,最后关闭当前进程,进行安装
            try
            {
                //设置进度条
                List<int> resultList = new List<int>();
                for (int i = 0; i < 100; i++)
                {
                    resultList.Add(i);
                }

                //设置进度条的最大值和最小值
                this.progressBar1.Maximum = resultList.Count;
                this.progressBar1.Minimum = 0;

                foreach (int item in resultList)
                {
                    //下载压缩包
                    System.Net.WebClient client = new System.Net.WebClient();
                    client.DownloadFile(@"http://192.168.1.120/File/setup.rar", path + @"setup.rar");
                    this.progressBar1.Value++;
                }
            }
            catch
            {
                MessageBox.Show("当前没有网络或者文件地址不正确");
            }

            if (!Exists())
            {
                MessageBox.Show("不支持RAR解压缩");
                return;
            }
            //解a压1
            try
            {
                unCompressRAR(path + "\\setup", path, "setup.rar", false);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            btnInstall.Enabled = true;
            btnDown.Enabled = false;
        }

        //打开下载好的exe文件,并且关闭当前客户端所在的进程
        private void btnInstall_Click(object sender, EventArgs e)
        {
            if (File.Exists(path + @"\setup\cboxbeta2.0.0.7.exe"))
            {
                //打开下载好的exe文件
                Process.Start(path + @"\setup\cboxbeta2.0.0.7.exe");
                //关闭当前进程
                Process[] proce = Process.GetProcesses();
                foreach (Process p in proce)
                {
                    //当前运行软件的进程名字
                    if (p.ProcessName == "TestAutoUpdate.vshost")
                    {
                        p.Kill();
                        break;
                    }
                }
            }
        }

        /// <summary>
        /// 解压缩文件t
        /// </summary>
        /// <param name="unRarPatch">解压缩后的文件所要存放的路径?</param>
        /// <param name="rarPatch">rar文件所在的路径</param>
        /// <param name="rarName">rar文件名</param>
        /// <param name="deleteFlag"></param>
        /// <returns></returns>
        public static string unCompressRAR(string unRarPatch, string rarPatch, string rarName, bool deleteFlag)
        {
            try
            {

                RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe");
                string str = key.GetValue("").ToString();
                key.Close();
                if (!System.IO.Directory.Exists(unRarPatch))
                {
                    System.IO.Directory.CreateDirectory(unRarPatch);
                }
                string str2 = "x \"" + rarName + "\" \"" + unRarPatch+"\""+" -y";
                ProcessStartInfo info = new ProcessStartInfo();
                info.FileName = str;
                info.Arguments = str2;
                info.WindowStyle = ProcessWindowStyle.Hidden;
                info.WorkingDirectory = rarPatch;
                Process process = new Process();
                process.StartInfo = info;
                process.Start();
                process.WaitForExit();
                process.Close();
                if (deleteFlag && System.IO.File.Exists(rarPatch + @"\" + rarName))
                {
                    System.IO.File.Delete(rarPatch + @"\" + rarName);
                }
            }
            catch (Exception exception)
            {
                throw exception;
            }
            return unRarPatch;
        }

        /// <summary>
        /// 判读是否支持RAR自动解压缩
        /// </summary>
        /// <returns></returns>
        public static bool Exists()
        {
            return !string.IsNullOrEmpty(Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe").GetValue("").ToString());
        }

时间: 2024-10-03 21:15:17

如何让程序自动更新的相关文章

EF-使用迁移技术让程序自动更新数据库表结构

承接上一篇文章:关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析 本篇讲述的是怎么使用迁移技术让程序自动通过ORM框架将模型实体类结构映射到现有数据库,并新增或修改与之对应的表结构. 无论承不承认,都要使用到visual studio的"程序包管理器控制台"执行相关的命令. 1.使用"程序包管理器控制台" 工具>NuGet程序包管理器>程序包管理器控制台 这货的界面是这样子的: 选中默认项目为DAL,因为我们在DAL项目

利用pre平台实现iOS应用程序自动更新

1 // 2 // AppDelegate.m 3 // PreAutoUpdateDemo 4 // 5 // Created by mac on 15/12/18. 6 // Copyright © 2015年 mac. All rights reserved. 7 // 8 9 #import "AppDelegate.h" 10 11 #define USER_KEY @"1234321344SDFDFBVVFGDSVF" // 根据实际情况替换为自己的us

【Android】Android程序自动更新

App自动更新的步骤可分为三步: 检查更新(如果有更新进行第2步,否则返回) 下载新版的APK安装包 安装APK 下面对这三步进行解释,其中会穿插相应代码,App自动更新的这三步全部被封装到了一个单独的Updater类中,可以直接拿来使用,我会在文章最后贴出源码github地址. Updater 使用示例 通过单一的类Updater可以方便的实现自动检查更新.下载安装包和自动安装,可以监听下载进度,可以自定义更新提示等.保存路径可以自由书写,如果路径中某个目录不存在会自动创建,流式API接口易于

通用程序自动更新升级

1)服务端IIS网站上创建新的虚拟路径,给新创建的虚拟路径增加MIME类型:.bpl..ini等. 2)设置update.ini文件版本号配置文件 [ver]config.ini=1bplCommon.bpl=1bplGoods.bpl=1bplPower.bpl=1bplPurchasing.bpl=1prjMain.exe=2 3)客户端 untAutoUpdate.dfm文件: object frmAutoUpdate: TfrmAutoUpdate Left = 0 Top = 0 Ca

C#程序自动更新软件版本号

最近因为服务器程序管理多,所以在查看服务器程序的时候,只能通过EXE的编译时间来判断服务器程序版本时间,费神伤身啊 现在想了一个方式,在目录下新增一个version文件,里面写上年月日,并且只是在程序调试编译时才会更新version文件,以达到记录程序版本号的目的 1 if (Debugger.IsAttached)//判断是否调试编译,是的话则将当前年月日写入文件 2 { 3 using (FileStream file = new FileStream(Application.Startup

小程序自动更新版本

小程序迭代的比较快,每次发布了新的代码,都更新不及时,着急的时候,得删除了重新搜索才可以.觉得很麻烦,就查了一些方法. 代码如下: // 获取小程序更新机制兼容 if (wx.canIUse('getUpdateManager')) { const updateManager = wx.getUpdateManager() updateManager.onCheckForUpdate(function (res) { // 请求完新版本信息的回调 if (res.hasUpdate) { upd

PHP自动更新网站

目前软件开发主流越来越倾向于B/S模式,不同于C/S模式的软件,B/S模式下的WEB程序自动更新是个麻烦问题. 本人利用PHP下载远程文件和ZIP类,写了一个简单的自动更新DEMO,供大家参考. 服务端 目录结构 |data |--20140918.zip |--index.php 其中 data 文件夹用来存放补丁包,index.php 文件用来响应版本数据给客户端. index.php <?php sleep(3); header('Content-Type:application/json

转C#实现之(自动更新)http://www.cnblogs.com/yelanggu/p/9288149.html

做开发的人,尤其是做客户端(C/S)系统开发的人都会遇到一个头疼的问题,就是软件的自动更新:系统发布后怎样自动的更新程序,在下有幸开发过一个自动更新程序,更新程序与任何宿主程序是完全独立的:只要在主程序里面启动更新程序就行了:更新程序也是一个可执行文件,在启动的时候可以设置是否是自动更新和是否是手动更新,自动更新的意思就是说不需要人工的干预实现从远程服务器下载更新包,而如果是手动更新就会涉及到用户点击程序中的按钮实现更新:在自动更新与手动更新中可以根据项目的需要进行选择,有的程序必须要求用户进行

在windows平台下electron-builder实现前端程序的打包与自动更新

由于8月份上旬公司开发一款桌面应用程序,在前端开发程序打包更新时遇到一些困扰多日的问题,采用electron-builder最终还是得到解决~ 以下是踩坑的过程及对electron打包与更新思路的梳理,electron打包与更新的正确姿势应该如下图所示 下面将逐一展开描述说明     一.windows系统下环境配置 NPM是随NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并安装别人编