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");

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章