微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Winform 程序自动更新

一、WebService

1.1 编写自动更新WebService

 读服务器上关于程序各个版本信息的配置文件UpdateConfig.xml
    [WebMethod]
    public System.Xml.XmlDocument AppUpdateVertion()
    {
        System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
        xml.Load(CurrentPath("/IEMS_OP_AppUpdate") + @"/UpdateConfig.xml");
        return xml;
    }
    private string CurrentPath(string virtualPath)
    {
        return HttpContext.Current.Server.MapPath(virtualPath);
    }  

1.2 UpdateConfig.xml配置文件

配置文件说明:module--模块信息,
                            version--版本信息,
                            appUrl--更新文件在服务器存放的路径
<root xmlns="">
  <module>
    <moduleName>Biz.dll</moduleName>
    <version>1.0.0.1</version>
    <appUrl>http://localhost/IEMS_OP_AppUpdate/1.0.0.1/Biz.dll</appUrl>
  </module>
  <module>
    <moduleName>CodeList.dll</moduleName>
    <version>1.0.0.1</version>
    <appUrl>http://localhost/IEMS_OP_AppUpdate/1.0.0.1/CodeList.dll</appUrl>
  </module>
</root>

1.3 生成WebService代理类

使用.Net命令行wsdl,生成WebService代理类

二、自动更新程序

2.1 文件下载

        private void DownloadFile(string source,string fileName)
        {
            try
            {
                System.Net.WebClient myWebClient = new System.Net.WebClient();
                myWebClient.DownloadFile(source,fileName);
            }
            catch (Exception ex)
            {
                throw new Exception("下载失败,原因是:" + ex.Message,ex);
            }
        }


2.2 校验版本信息
        private void VersionCheck(string desPath,string webServiceAddress)
        {
            try
            {
                #region 查看文件和目录
                if (!desPath.EndsWith(@"/"))
                    desPath += @"/";

                if (!System.IO.Directory.Exists(desPath))
                {
                    System.IO.Directory.CreateDirectory(desPath);
                }

                string tempPath = desPath + @"tempDesPathCache/";

                if (System.IO.Directory.Exists(tempPath))
                {
                    System.IO.Directory.Delete(tempPath,true);
                    System.IO.Directory.CreateDirectory(tempPath);
                }
                else
                    System.IO.Directory.CreateDirectory(tempPath);

                if (!System.IO.File.Exists(desPath + "UpdateConfig.xml"))
                {
                    System.Xml.XmlDocument updateConfig = new System.Xml.XmlDocument();
                    updateConfig.LoadXml(@"<root></root>");
                    updateConfig.Save(desPath + "UpdateConfig.xml");
                }
                #endregion

                WebService appUpdate = new WebService();
                appUpdate.Url = webServiceAddress;
                System.Xml.XmlDocument serverXmlDoc = appUpdate.AppUpdateVertion();
                System.Xml.XmlDocument localXmlDoc = new System.Xml.XmlDocument();
                localXmlDoc.Load(desPath + "UpdateConfig.xml");
                bool newVersionExist = false;
                bool moduleExist = false;
                System.Xml.XmlNode serverNode0 = serverXmlDoc.ChildNodes[0];
                System.Xml.XmlNode localNode0 = localXmlDoc.ChildNodes[0];
                foreach (System.Xml.XmlNode serverNode in serverNode0)
                {
                    moduleExist = false;
                    foreach (System.Xml.XmlNode localNode in localNode0)
                    {
                        //找到对应模块
                        if (localNode.ChildNodes[0].InnerText == serverNode.ChildNodes[0].InnerText)
                        {
                            moduleExist = true;
                            //版本号判断
                            if (localNode.ChildNodes[1].InnerText.Compareto(serverNode.ChildNodes[1].InnerText) < 0)
                            {
                                newVersionExist = true;
                                DownloadFile(serverNode.ChildNodes[2].InnerText,tempPath + serverNode.ChildNodes[0].InnerText);
                            }
                            break;
                        }
                    }
                    //没找到对应模块
                    if (false == moduleExist)
                    {
                        DownloadFile(serverNode.ChildNodes[2].InnerText,tempPath + serverNode.ChildNodes[0].InnerText);
                        newVersionExist = true;
                    }
                }
                //写入新UpdateConfig.xml升级完毕后替换
                if (newVersionExist)
                {
                    serverXmlDoc.Save(tempPath + "UpdateConfig.xml");
                    if (DialogResult.Yes == MessageBox.Show("有新版本,升级否","提示",MessageBoxButtons.YesNo))
                    {
                        string[] dirs = System.IO.Directory.GetFiles(tempPath,"*.*");
                        string fileName;
                        foreach (string dir in dirs)
                        {
                            fileName = ((dir.Split(Convert.tochar(@"/")))[dir.Split(Convert.tochar(@"/")).Length - 1]);
                            if (System.IO.File.Exists(desPath + fileName))
                            {
                                //Todo:可以支持备份以前版本
                                System.IO.File.Delete(desPath + fileName);
                            }
                            //Todo:如果系统正在运行,您得停止系统,至于如何停止,也许可以使用System.Diagnostics.Process
                            System.IO.File.Move(dir,desPath + fileName);
                        }
                        MessageBox.Show("升级完毕");
                    }
                    else
                    {
                        //Todo:可以支持重新提示升级
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("升级失败,原因是:" + ex.Message,ex);
            }
        }

2.3 运新更新
           
string path = Application.StartupPath;
            this.VersionCheck(path,"http://localhost:4011/AppUpdate/WebService.asmx");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐