winform自动更新

 

本示例共由三个项目组成:

  UpdateSolution:更新程序,用于更新WinForm

  UpdateWeb:webService,更新服务,用于远程连接更新,获取版本号与新文件下载地址

  WinForm:主程序

  UpdateSolution.ini :当前版本文件 (本地)

先创建服务

UpdateWeb 核心代码:

 service

<%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" Class="Service" %>

serviceCode:

 /// <summary>
    /// 获取版本号
    /// </summary>
    /// <returns>更新版本号</returns>
    [WebMethod]
    public string GetVersion() 
    {
        return ConfigurationManager.ConnectionStrings["version"].ConnectionString;
    }
    /// <summary>
    /// 获取下载地址
    /// </summary>
    /// <returns>下载地址</returns>
    [WebMethod]
    public string GetUrl()
    {
        return ConfigurationManager.ConnectionStrings["url1"].ConnectionString + ConfigurationManager.ConnectionStrings["directory"].ConnectionString;
    }
    /// <summary>
    /// 获取下载zip压缩包
    /// </summary>
    /// <returns>下载zip压缩包</returns>
    [WebMethod]
    public string[] GetZips()
    {
        string folder=HttpRuntime.AppDomainAppPath + ConfigurationManager.ConnectionStrings["directorys"].ConnectionString;
        string[] zips = Directory.GetFileSystemEntries(folder);
        for (int i = 0; i < zips.Length; i++)
        {
            zips[i] = Path.GetFileName(zips[i]);
        }
        return zips;
    }

    三个方法

配置文件web.config:

<connectionStrings>
    <!--版本号--> //要更新成什么版本号
    <add name="version" connectionString="1.0.0"/>
    <!--下载地址-->
    <add name="url1" connectionString="http://localhost:8080/"/>
    <!--下载目录,最好为一级目录免得麻烦-->
    <add name="directory" connectionString="UpdateFile/Update.zip"/>
    <add name="directorys" connectionString="UpdateFile/"/>
  </connectionStrings>

服务完成了

发布一下

配置IIS

更新程序开始:

先引用上面的服务

 

 

 

 

 

 

 

 

 

 引用完成

 

我的更新程序页面

 

 

 

 按钮点击事件:

  UpdateServices.Service service = new UpdateSolution.UpdateServices.Service();//webservice服务
            string str = System.Windows.Forms.Application.StartupPath;
            zips = service.GetZips();
            string url = str + @"\" + zips[0];
            string DownUrl = service.GetUrl();
            bool flag = DownloadFile(DownUrl, url, this.progressBar1, label1);

            if (flag)
            {
                UnZip(url, str);
                System.IO.File.Delete(url);
                IniClass ini = new IniClass(Application.StartupPath + @"\UpdateSolution.ini");
                string serviceVersion = service.GetVersion();//服务端版本
                ini.IniWriteValue("UpdateSolution", "version", serviceVersion);//更新成功后将版本写入配置文件
            }
            Application.Exit();//退出升级程序
            Process.Start("WinForm.exe");//打开主程序Main.exe

上面用的的两个辅助方法

   /// <summary>        
        /// c#,.net 下载文件        
        /// </summary>        
        /// <param name="URL">下载文件地址</param>       
        /// 
        /// <param name="Filename">下载后的存放地址</param>        
        /// <param name="Prog">用于显示的进度条</param>        
        /// 
        public bool DownloadFile(string URL, string filename, System.Windows.Forms.ProgressBar prog, System.Windows.Forms.Label label1)
        {
            float percent = 0;
            try
            {
                System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL);
                System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();
                long totalBytes = myrp.ContentLength;
                if (prog != null)
                {
                    prog.Maximum = (int)totalBytes;
                }
                System.IO.Stream st = myrp.GetResponseStream();
                System.IO.Stream so = new System.IO.FileStream(filename, System.IO.FileMode.Create);
                long totalDownloadedByte = 0;
                byte[] by = new byte[1024];
                int osize = st.Read(by, 0, (int)by.Length);
                while (osize > 0)
                {
                    totalDownloadedByte = osize + totalDownloadedByte;
                    so.Write(by, 0, osize);
                    if (prog != null)
                    {
                        prog.Value = (int)totalDownloadedByte;
                    }
                    osize = st.Read(by, 0, (int)by.Length);
                  
                        percent = (float)totalDownloadedByte / (float)totalBytes * 100;
                        label1.Text = "当前更新下载进度" + percent.ToString() + "%";
                        Application.DoEvents(); //必须加注这句代码,否则label1将因为循环执行太快而来不及显示信息
                }
                so.Close();
                st.Close();
                return true;
            }
            catch (System.Exception)
            {
                return false;
                throw;
            }
        }

        /// <summary>
        /// 解压zip 文件
        /// </summary>
        /// <param name="fileFromUnZip"></param>
        /// <param name="fileToUnZip"></param>
        public static void UnZip(string fileFromUnZip, string fileToUnZip)
        {
            ZipInputStream inputStream = new ZipInputStream(File.OpenRead(fileFromUnZip));
            ZipEntry theEntry;
            while ((theEntry = inputStream.GetNextEntry()) != null)
            {
                fileToUnZip += "/";
                string fileName = Path.GetFileName(theEntry.Name);
                string path = Path.GetDirectoryName(fileToUnZip) + "/";
                // Directory.CreateDirectory(path);//生成解压目录
                if (fileName != String.Empty)
                {
                    FileStream streamWriter = File.Create(path + fileName);//解压文件到指定的目录 
                    int size = 2048;
                    byte[] data = new byte[2048];
                    while (true)
                    {
                        size = inputStream.Read(data, 0, data.Length);
                        if (size > 0)
                        {
                            streamWriter.Write(data, 0, size);
                        }
                        else
                        {
                            break;
                        }
                    }
                    streamWriter.Close();
                }
            }
            inputStream.Close();
        }

读取ini文件的类:

 public class IniClass
    {
        public string iniPath;
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
        /// <summary> 
        /// 构造方法 
        /// </summary> 
        /// <param name="IniPath">文件路径</param> 
        public IniClass(string iniPath)
        {
            this.iniPath = iniPath;
        }
        /// <summary> 
        /// 写入INI文件 
        /// </summary> 
        /// <param name="Section">项目名称(如 [TypeName] )</param> 
        /// <param name="Key"></param> 
        /// <param name="Value"></param> 
        public void IniWriteValue(string Section, string Key, string Value)
        {
            WritePrivateProfileString(Section, Key, Value, this.iniPath);
        }
        /// <summary> 
        /// 读出INI文件 
        /// </summary> 
        /// <param name="Section">项目名称(如 [TypeName] )</param> 
        /// <param name="Key"></param> 
        public string IniReadValue(string Section, string Key)
        {
            StringBuilder temp = new StringBuilder(500);
            int i = GetPrivateProfileString(Section, Key, "", temp, 500, this.iniPath);
            return temp.ToString();
        }
        /// <summary> 
        /// 验证文件是否存在 
        /// </summary> 
        /// <returns>布尔值</returns> 
        public bool ExistIniFile()
        {
            return File.Exists(iniPath);
        }
    }

 

 WinForm:核心代码

////检测更新
            IniClass ini = new IniClass(Application.StartupPath + @"\UpdateSolution.ini");
            UpdateServices.Service service = new UpdateServices.Service();
            string clientVersion = ini.IniReadValue("UpdateSolution", "version");//客户端版本
            try
            {
                string serviceVersion = service.GetVersion();//服务端版本
                this.lblbanben.Text = "V" + clientVersion;
                if (clientVersion != serviceVersion)
                {
                    DialogResult dialogResult = MessageBox.Show("有新版本,是否更新?", "升级", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
                    if (dialogResult == DialogResult.OK)
                    {
                        Application.Exit();
                        Process.Start("UpdateSolution.exe");
                    }
                }
            }
            catch (Exception ex)
            {

            }

 

更新的时候只需要改变web,config中的内容,与发布地址中文件的内容

Demo地址:https://lanzous.com/id1bg0b

posted @ 2020-05-27 10:56  sunshuaize  阅读(665)  评论(0编辑  收藏  举报