精华内容
下载资源
问答
  • winForm自动更新程序源码实现CS模式连接服务器自动更新
  • Winform自动更新程序源码(支持增量更新,删除文件操作)
  • winform自动更新程序

    2017-07-19 11:17:46
    1.把winform自动升级发布到iis 2.把你的winform程序放到里面 3.把自动升级的exe和autoupdater.xml放到你的winform程序的debug里面 4.在你的程序的登录的load事件里面加入 private void frmLogin_Load(object sender...
  • C#winform自动更新程序及DEMO

    热门讨论 2011-05-23 19:48:50
    一个C#winform自动更新程序及DEMO
  • 本文实例为大家分享了C# Winform 自动更新程序,供大家参考,具体内容如下 第一步:检查更新 检查更新其实无非就是去比较更新包的版本和本地软件版本,如果高则更新、低则不更新。怎么获取版本号方法很多,本案例是...
  • 实现c#开发的winform程序根据程序版本号是否需要更新程序,启动更新程序从服务器下载新版本程序并解压覆盖主程序,运行主程序
  • WinForm自动更新程序

    2020-06-02 11:14:06
    WinForm自动更新程序WinForm自动更新程序思路代码结尾 WinForm自动更新程序 刚刚开始搞Winfrom开发的小伙伴经常遇到这样一个问题:程序在公司内部广泛使用,特别是在自动化的工厂内部,在需求频繁变更的时候每次更新...

    WinForm自动更新程序

    WinForm自动更新程序

    刚刚开始搞Winfrom开发的小伙伴经常遇到这样一个问题:程序在公司内部广泛使用,特别是在自动化的工厂内部,在需求频繁变更的时候每次更新都是一件心态爆炸的事情,这时候一个自动更新的程序就非常有必要。
    在查找了网上众多资料后,发现不是收费的,就是代码没法使用,最终决定还是自己写一个。根据网上资料学习和自身业务,完成下述代码。
    

    思路

    在用户打开程序的时候,无法直接更新本体程序,那就需要新建一个小的更新程序来进行更新的事情。
    

    在主体程序的开始时先行判断当前版本是否为最新,不是则开始调用更新程序并关闭主体程序。更新程序完成更新后再回调主体程序。

    代码

    更新程序

    			MaterialManageEntities db = new MaterialManageEntities();
                Thread.Sleep(5000);//此处暂停是为了等主体程序完全关闭才能删除
                string sys_path = db.System_Config.Where(x => x.Name == "Path").FirstOrDefault().Text;//获得保存在数据库的下载路径
                var list = db.File_Path.ToList();
                foreach (var info in list)//删除旧的文件
                {
                    FileInfo file = new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, info.Name));
                    file.Delete();
                }
    
                WebClient wc = new WebClient();
                foreach (var info in list)
                {
                    wc.DownloadFile(new Uri(sys_path + info.Name), info.Name);//要下载文件的路径,下载之后的命名
                }
                string path = Application.StartupPath + "\\";
                System.Diagnostics.Process process = new System.Diagnostics.Process();
                process.StartInfo.FileName = "主体项目.exe";
                process.StartInfo.WorkingDirectory = path;//要掉用得exe路径例如:"C:\windows";               
                process.StartInfo.CreateNoWindow = true;
                process.Start();
                Application.Exit();
    

    主体中如何调用

     //根据电脑的MAC地址从数据库得到该电脑对应的版本号,这是由于之前的业务决定的,如果不需要统一管理,可以采取本地XML文件记录
                MaterialManageEntities db = new MaterialManageEntities();//这块使用的是微软自带的ADO.NET连接数据库,可以改成你们习惯的写法
                //获得MAC地址
                string macAddr = PublicMethod.MachineMac();
    
                var machine = db.MES_MachineMacList.Where(x => x.MachineMac == macAddr).FirstOrDefault();
                var version = db.System_Config.Where(x => x.Name == "Version").FirstOrDefault().Text;
                if (machine != null)//判断是否有记录授权
                {
                    if (machine.IsBan == false)
                    {
                        if (machine.Version.ToString() == version)//判断版本号
                        {
    
                            Application.EnableVisualStyles();
                            Application.SetCompatibleTextRenderingDefault(false); 
                            Login fl = new Login();
                            fl.ShowDialog();
                            if (fl.DialogResult == DialogResult.OK)
                            {
                                Application.Run(new Form1());
                            }
    
                        }
                        else
                        {
                            if (MessageBox.Show("检查到新版本,是否更新?", "Update", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                            {
                                machine.Version = int.Parse(version);
                                db.SaveChanges();
                                //更新
                                string fileName = Application.StartupPath + @"\update.exe";
                                Process p = new Process();
                                p.StartInfo.UseShellExecute = false;
                                p.StartInfo.RedirectStandardOutput = true;
                                p.StartInfo.FileName = fileName;
                                p.StartInfo.CreateNoWindow = true;
                                p.StartInfo.Arguments = "";//参数以空格分隔,如果某个参数为空,可以传入””
                                p.Start();
                                System.Environment.Exit(System.Environment.ExitCode);   //结束主线程
                                //string output = p.StandardOutput.ReadToEnd(); //this.Dispose();//关闭主程序
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("请联系IT授权");
                    }
                }
                else
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Form1 fl = new Form1();//此处应打开注册页
                    fl.ShowDialog();
    
                }
    

    结尾

    该更新程序可以改为7z压缩下载后再解压的方式,可以免去文件列表和部分文件不好下载的问题,作者太忙没来得及去改(其实是比较懒。。。),如有哪位大佬修改完成请提供参考下。

    程序源码地址:https://github.com/luyuan311/update.git.
    如果觉得对你有用或者觉得还行的话,麻烦帮忙再Star上点一下。

    展开全文
  • 用于winform程序自动更新操作,使用http的下载方式,支持多文件下载,文件自动配置,还不错的一个更新工具,通俗易懂
  • 当用户在运行主程序窗体并点击左上角的更新按钮时,弹出程序更新窗体,并先自动从IIS中拉取updateList.xml文件,然后与本地程序作对比,检测是否需要升级软件; 如果有新版本发布,则点击“立即更新”按钮,程序将从...
  • winForm自动更新程序源码
  • C# winform自动更新程序扫盲

    万次阅读 2016-04-14 09:46:06
    自动更新 我直接简单明了的说干的 虚的就不整那么多了,类似这样 ...思路是一个客户端一个主程序exe 自动更新程序exe 上图 这是自动更新是单独的一个exe 可能有童鞋要问 为啥子是单独一个exe呢

    http://bbs.bccn.net/viewthread.php?tid=428255&extra=page%3D1%26amp%3Bfilter%3Ddigest&page=1

    自动更新 我直接简单明了的说干的 虚的就不整那么多了,类似这样
    思路是一个客户端一个主程序exe 自动更新程序exe 上图

    这是自动更新是单独的一个exe 可能有童鞋要问 为啥子是单独一个exe呢 俺的思路是这样 这个exe根据版本号从服务端下载程序 下载完成后 替换主程序的exe 并重新启动主程序exe
    看看这个autoupdate的代码吧 
    主要如下 这里提供一个思路

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Update;
    using System.Threading;
    using System.IO;
    using System.Runtime.InteropServices;
    namespace autoUpdate
    {
        public partial class Form1 : Form
        {
            [DllImport("zipfile.dll")]
            public static extern int MyZip_ExtractFileAll(string zipfile, string pathname);
            public Form1()
            {
                InitializeComponent();
    
                //清除之前下载来的rar文件
                if (File.Exists(Application.StartupPath + "\\Update_autoUpdate.rar"))
                {
                    try
                    {
                        File.Delete(Application.StartupPath + "\\Update_autoUpdate.rar");
                    }
                    catch (Exception)
                    {
    
    
                    }
    
                }
                if (Directory.Exists(Application.StartupPath + "\\autoupload"))
                {
                    try
                    {
                        Directory.Delete(Application.StartupPath + "\\autoupload", true);
                    }
                    catch (Exception)
                    {
    
    
                    }
                }
               
                //检查服务端是否有新版本程序
                checkUpdate();
                timer1.Enabled = true;
            }
    
            SoftUpdate app = new SoftUpdate(Application.ExecutablePath, "xinDianClient");
            public void checkUpdate()
            {
    
                app.UpdateFinish += new UpdateState(app_UpdateFinish);
                try
                {
                    if (app.IsUpdate)
                    {
                        app.Update();
                    }
                    else
                    {
                        MessageBox.Show("未检测到新版本!");
                        Application.Exit();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            void app_UpdateFinish()
            {
                //解压下载后的文件
                string path = app.FinalZipName;
                if (File.Exists(path))
                {
                     //后改的 先解压滤波zip植入ini然后再重新压缩
                    string dirEcgPath = Application.StartupPath + "\\" + "autoupload";
                    if (!Directory.Exists(dirEcgPath))
                    {
                        Directory.CreateDirectory(dirEcgPath);
                    }
                    //开始解压压缩包
                    MyZip_ExtractFileAll(path, dirEcgPath);
    
                    try
                    {
                        //复制新文件替换旧文件
                        DirectoryInfo TheFolder = new DirectoryInfo(dirEcgPath);
                        foreach (FileInfo NextFile in TheFolder.GetFiles())
                        {
                            File.Copy(NextFile.FullName, Application.StartupPath + "\\program\\" + NextFile.Name,true);
                        }
                        Directory.Delete(dirEcgPath,true);
                        File.Delete(path);
                        //覆盖完成 重新启动程序
                        path = Application.StartupPath + "\\program";
                        System.Diagnostics.Process process = new System.Diagnostics.Process();
                        process.StartInfo.FileName = "xinDianClient.exe";
                        process.StartInfo.WorkingDirectory = path;//要掉用得exe路径例如:"C:\windows";               
                        process.StartInfo.CreateNoWindow = true;
                        process.Start();
    
                        Application.Exit();
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("请关闭系统在执行更新操作!");
                        Application.Exit();
                    }
    
                   
                
                   
                }
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                label2.Text = "下载文件进度:" + COMMON.CommonMethod.autostep.ToString() + "%";
                if (COMMON.CommonMethod.autostep==100)
                {
                    timer1.Enabled = false;
                }
            }
    
        }
    }


    简单的说就是检查服务端的是否有新版本 然后呢 下载到本地 并替换在打开 


    SoftUpdate是一个下载操作类

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Reflection;
    using System.IO;
    using System.Net;
    using System.Xml;
    using COMMON;
    
    namespace Update
    {
        /// <summary>  
        /// 更新完成触发的事件  
        /// </summary>  
        public delegate void UpdateState();
        /// <summary>  
        /// 程序更新  
        /// </summary>  
        public class SoftUpdate
        {
    
            private string download;
            private const string updateUrl = "http://33.8.11.117:8019/update.xml";//升级配置的XML文件地址  
    
            #region 构造函数
            public SoftUpdate() { }
    
            /// <summary>  
            /// 程序更新  
            /// </summary>  
            /// <param name="file">要更新的文件</param>  
            public SoftUpdate(string file, string softName)
            {
                this.LoadFile = file;
                this.SoftName = softName;
            }
            #endregion
    
            #region 属性
            private string loadFile;
            private string newVerson;
            private string softName;
            private bool isUpdate;
    
            /// <summary>  
            /// 或取是否需要更新  
            /// </summary>  
            public bool IsUpdate
            {
                get
                {
                    checkUpdate();
                    return isUpdate;
                }
            }
    
            /// <summary>  
            /// 要检查更新的文件  
            /// </summary>  
            public string LoadFile
            {
                get { return loadFile; }
                set { loadFile = value; }
            }
    
            /// <summary>  
            /// 程序集新版本  
            /// </summary>  
            public string NewVerson
            {
                get { return newVerson; }
            }
    
            /// <summary>  
            /// 升级的名称  
            /// </summary>  
            public string SoftName
            {
                get { return softName; }
                set { softName = value; }
            }
    
            private string _finalZipName = string.Empty;
    
            public string FinalZipName
            {
                get { return _finalZipName; }
                set { _finalZipName = value; }
            }
    
            #endregion
    
            /// <summary>  
            /// 更新完成时触发的事件  
            /// </summary>  
            public event UpdateState UpdateFinish;
            private void isFinish()
            {
                if (UpdateFinish != null)
                    UpdateFinish();
            }
    
            /// <summary>  
            /// 下载更新  
            /// </summary>  
            public void Update()
            {
                try
                {
                    if (!isUpdate)
                        return;
                    WebClient wc = new WebClient();
                    string filename = "";
                    string exten = download.Substring(download.LastIndexOf("."));
                    if (loadFile.IndexOf(@"\") == -1)
                        filename = "Update_" + Path.GetFileNameWithoutExtension(loadFile) + exten;
                    else
                        filename = Path.GetDirectoryName(loadFile) + "\\Update_" + Path.GetFileNameWithoutExtension(loadFile) + exten;
    
                    FinalZipName = filename;
                    //wc.DownloadFile(download, filename);
                    wc.DownloadFileAsync(new Uri(download), filename);
                    wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
                    wc.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(wc_DownloadFileCompleted);
                    //wc.Dispose();
                 
                }
                catch
                {
                    throw new Exception("更新出现错误,网络连接失败!");
                }
            }
    
            void wc_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
            {
                (sender as WebClient).Dispose();
                isFinish();
            }
    
            void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
            {
                CommonMethod.autostep = e.ProgressPercentage;
            }
    
            /// <summary>  
            /// 检查是否需要更新  
            /// </summary>  
            public void checkUpdate()
            {
                try
                {
                    WebClient wc = new WebClient();
                    Stream stream = wc.OpenRead(updateUrl);
                    XmlDocument xmlDoc = new XmlDocument();
                    xmlDoc.Load(stream);
                    XmlNode list = xmlDoc.SelectSingleNode("Update");
                    foreach (XmlNode node in list)
                    {
                        if (node.Name == "Soft" && node.Attributes["Name"].Value.ToLower() == SoftName.ToLower())
                        {
                            foreach (XmlNode xml in node)
                            {
                                if (xml.Name == "Verson")
                                    newVerson = xml.InnerText;
                                else
                                    download = xml.InnerText;
                            }
                        }
                    }
    
                    Version ver = new Version(newVerson);
                    Version verson = Assembly.LoadFrom(loadFile).GetName().Version;
                    int tm = verson.CompareTo(ver);
    
                    if (tm >= 0)
                        isUpdate = false;
                    else
                        isUpdate = true;
                }
                catch (Exception ex)
                {
                    throw new Exception("更新出现错误,请确认网络连接无误后重试!");
                }
            }
    
            /// <summary>  
            /// 获取要更新的文件  
            /// </summary>  
            /// <returns></returns>  
            public override string ToString()
            {
                return this.loadFile;
            }
        }
    }
    
    OK 下载的exe写完了 现在呢客户端还差一点就是要在主程序中嵌入它
    主程序呢我是这样写的 请不懂的骚年看主要代码
     [STAThread]
            static void Main()
            {
                if (checkUpdateLoad())
                {
                    Application.Exit();
                    return;
                }
                //执行打开主窗体之类的代码。。。。
            }   
    
            public static  bool checkUpdateLoad()
            {
                bool result = false;
                SoftUpdate app = new SoftUpdate(Application.ExecutablePath, "xinDianClient");
                try
                {
                    if (app.IsUpdate && MessageBox.Show("检查到新版本,是否更新?", "版本检查", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        string path = Application.StartupPath.Replace("program", "");
                        System.Diagnostics.Process process = new System.Diagnostics.Process();
                        process.StartInfo.FileName = "autoUpdate.exe";
                        process.StartInfo.WorkingDirectory = path;//要掉用得exe路径例如:"C:\windows";               
                        process.StartInfo.CreateNoWindow = true;
                        process.Start();
    
                        result = true;
                    }
                    else
                    {
                        result = false;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    result = false;
                }
                return result;
            }

    启动main函数的时候 检查服务端是否有更新 结合SoftUpdate类看就一目了然了 要特别注意目录 为啥子这样说呢 因为有的dll要公用 正在使用就无法替换 所以要分开 
    所以我的做法是 把主程序放到一个目录 自动更新在外部 


    [assembly: AssemblyVersion("1.0.0.3")]
    [assembly: AssemblyFileVersion("1.0.0.3")]

    还有特别要注意的一点 因为要速度嘛 我索性用了.net自带的版本控制 当然也可以自己写 
    主要在这里 要特别注意一下 


    OK 现在要部署服务端了 服务端呢 是个zip 我用的zipfile 进行压缩和解压缩的 
    所以要在服务端部署 最好用这个dll生成一个压缩包
    然后部署在服务端iis服务器中 

    rar 是更新程序 包括要更新的 exe dll之类的
    <?xml version="1.0" encoding="utf-8" ?>  
    <Update> 
       <Soft Name="update"> 
         <Verson>1.0.0.3</Verson>  
         <DownLoad>http://33.8.11.117:8079/update.rar</DownLoad>  
      </Soft> 
    </Update> 

    xml内容 一看都明白了把 下载地址 软件名次 版本号


    展开全文
  • 本人写的针对WinForm程序自动升级程序,适用于所有WinForm客户端程序,非常方便,分享给大家共同学习。
  • Winform自动升级实现代码
  • C# Winform 自动更新程序实例 第一步:检查更新 检查更新其实无非就是去比较更新包的版本和本地软件版本,如果高则更新、低则不更新。怎么获取版本号方法很多,本案例是获取软件的配置文件。 private bool Check...

    C# Winform 自动更新程序实例

    关闭主程序

    #region 关闭主程序
    Process[] procArr = Process.GetProcessesByName(MAIN_APP_NAME.Replace(".exe", ""));
    if (procArr != null && procArr.Count() != 0) {
           AppendLogLine("等待关闭主应用-" + MAIN_APP_NAME);
           Process proc = procArr[0];
           proc.CloseMainWindow();
           //proc.Close();
           proc.WaitForExit(5000);
           if (proc.HasExited) {
              AppendLogLine(String.Format("主程序 {0} 已经退出!", MAIN_APP_NAME));
            } else {
                   // 如果外部程序没有结束运行则强行终止之。
                   proc.Kill();
                  AppendLogLine(String.Format("主程序 {0} 被强行终止!", this.MAIN_APP_NAME));
            }
           AppendLogLine("成功关闭主应用");
    }
    #endregion

     

    第一步:检查更新

    检查更新其实无非就是去比较更新包的版本和本地软件版本,如果高则更新、低则不更新。怎么获取版本号方法很多,本案例是获取软件的配置文件

    private bool CheckUpdate()
            {
                bool result = false;
                try
                {
                    string Cfg = TxtRead(exePath   "\\Config.txt");
                    ConfigLocal = JsonConvert.DeserializeObject<DTO_Config>(Cfg);
     
                    CheckUpdateURL = ConfigLocal.AutoUpdateURL;
     
                    Cfg = TxtRead(CheckUpdateURL   "\\Config.txt");
                    ConfigRemote = JsonConvert.DeserializeObject<DTO_Config>(Cfg);                
     
                    VersionR = ConfigRemote.Version;
                    VersionL = ConfigLocal.Version;
                    int VersionRemote = int.Parse(ConfigRemote.Version.Replace(".", ""));
                    int VersionLocal = int.Parse(ConfigLocal.Version.Replace(".", ""));
     
                    result = VersionRemote > VersionLocal;
                }
                catch { }
                return result;
            

    第二步:下载更新包

    因为C/S的软件更新是面对所有用户,S端除了给C端提供基本的服务外,还可以给C端提供更新包。而这个S端可以是网络上的一个固定地址,也可以是局域网内一个公共盘。那下载更新包无非就是去访问服务端的文件,然后Copy下来或下载下来。下面给出访问网络和访问局域网两个案例:

    A、访问远程网络地址这里采用的是WebClient

    public void DownLoadFile() {
                if (!Directory.Exists(UpdateFiles))
                {
                    Directory.CreateDirectory(UpdateFiles);
                }
                using (WebClient webClient = new WebClient())
                {
                    try
                    {
                        webClient.DownloadFileCompleted  = new AsyncCompletedEventHandler(client_DownloadFileCompleted);
                        webClient.DownloadProgressChanged  = new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
                        webClient.DownloadFileAsync(new Uri(CheckUpdateURL   "\\UpdateFile.rar"), UpdateFiles   "\\UpdateFile.rar");
                    }
                    catch (WebException ex)
                    {
                        MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
            }
    }

    这里面应用到两个方法,DownloadProgressChanged,监听异步下载的进度;DownloadFileCompleted,监听完成异步文件下载;

    private void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) {
           this.progressBarUpdate.Minimum = 0;
           this.progressBarUpdate.Maximum = (int)e.TotalBytesToReceive;
           this.progressBarUpdate.Value = (int)e.BytesReceived;
           this.lblPercent.Text = e.ProgressPercentage   "%";
    }

     

    private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
            {
                if (e.Error != null)
                {
                    MessageBox.Show(e.Error.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    this.lblMessage.Text = "下载完成";
                    //复制更新文件替换旧文件
                    DirectoryInfo TheFolder = new DirectoryInfo(UpdateFiles);
                    foreach (FileInfo NextFile in TheFolder.GetFiles())
                    {
                        File.Copy(NextFile.FullName, Application.StartupPath   NextFile.Name, true);
                    }
                    
                }
            }

     

    B、访问服务端公共盘,直接采用File.Copy

    public void GetRemoteFile()
            {
                try
                {
                    DirectoryInfo TheFolder = new DirectoryInfo(CheckUpdateURL);
                    FileInfo[] FileList = TheFolder.GetFiles();
                    this.progressBarUpdate.Minimum = 0;
                    this.progressBarUpdate.Maximum = FileList.Length;
     
                    foreach (FileInfo NextFile in FileList)
                    {
                        if (NextFile.Name != "Config.txt")
                        {
                            File.Copy(NextFile.FullName, exePath   "\\"   NextFile.Name, true);                        
                        }
                        this.lblMessage.Text = "更新"   NextFile.Name;
                        this.progressBarUpdate.Value  = 1;
                        this.lblPercent.Text = "更新进度... "   (this.progressBarUpdate.Value / FileList.Length) * 100   "%";
                    }
                    this.lblMessage.Text = "更新完成";
                    //更改本地版本号为最新版本号
                    ConfigLocal.Version = VersionR;
                    string cfgs = JsonConvert.SerializeObject(ConfigLocal);
                    TxtWrite(Application.StartupPath   "\\Config.txt", cfgs);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

     

    第三步:替换本地文件

    这一步或许在第二步中已经实现了,如果你采用的是File.Copy。替换也就是复制粘贴的问题。采用WebClient下载了zip包,那还需解压一下压缩包然后再File.Copy。

    展开全文
  • 使用webclient实现winform程序自动更新和强制更新
  • c# winform 自动更新程序. web程序更新很简单,不用说了,而在C/S模式下怎么更新程序呢?下载后看看吧
  • Winform开发的检查更新程序。可用于Winform/WPF,主要功能包括更新文件、更新程序自身、下载安装包等
  • SharpUpdater 是一个引导加载程序,用于为基于 .NET 框架的 Windows 桌面应用程序添加自动更新功能。它也是一个解决方案,它提供了一个示例服务器程序和一组 API,供开发人员从 2.0 版本开始扩展。 最新版本是 2.1,...
  • 对于C/S架构来说,软件更新是一个很常用的功能。对于新手来说,软件自动升级功能的开发或许会有点难度。本文根据作者平时工作中实现的一种方式,介绍一种简单的软件自动升级方案。 工具/原料 VS2010 主程序中...

    对于C/S架构来说,软件更新是一个很常用的功能。对于新手来说,软件自动升级功能的开发或许会有点难度。本文根据作者平时工作中实现的一种方式,介绍一种简单的软件自动升级方案。

    工具/原料

    • VS2010

    主程序中实现

    1. 1

      这本文所述的方案中,主要是根据服务器中软件版本号和本地软件版本号是否一致,来确认程序是否需要升级。

      大致步骤如下:

       1.对比系统中版本号和数据库中存储版本号是否一致,若不一致,则进行系统升级。2.若本地系统版本号与系统中系统版本号不一致,则从ftp上面去下载相应文件的当前版本的软件包;3.把软件包下载到本地某一目录,将软件更新包重命名为后缀名为.zip的文件压缩包。4.此时关掉主程序的进程,并同时开启SystemUpdate.exe,(或者可写一个bat脚本(该方法有兴趣可以自己实现),启动update.exe;5.update.exe负责解压缩软件升级包,并且把文件解压到系统的安装目录下,替换掉原有的文件。6.解压替换完成后,需要重新开启原程序。7.若文件下载失败或者文件解压失败,需重新下载或者解压缩文件。并提示用户是否继续更新程序。 

    2. 2

      1.首先主程序里面需要有个检查版本号是否一致的方法,用于检查版本是否为最新,版本更新的代码如下所示,自己可根据表名不一致,更改相应的代码即可。

      C# 如何实现winform 软件自动更新程序功能

    3. 3

      2.若存在新的版本,则执行下载操作。首先我们把需要更新的文件上传至FTP,在上传的文件中,每次上传之前需在主程序中,定义好本程序的版本号,一般以定义一个CONST常量来保存版本号(可十进制或者十六进制,按照自己需求来定义)public const string SoftWareVersion = "16392";//版本号(用于版本升级)。文件下载的方法实现如下图所示,至于FTP上传下载的代码,可在网上参考相应的示例,本文不再提供相应代码。

      C# 如何实现winform 软件自动更新程序功能

    4. 4

      3.文件重命名:由于软件中标准要求,需上传的更新文件不能为压缩文件的形式,因此,本程序中,再上传更新包时,把需要打包的zip文件包,按照标准中的格式命名,然后下载后,重命名为压缩文件,保存到本地种。文件重命名的代码如下所示.

      C# 如何实现winform 软件自动更新程序功能

    5. 5

      4.关闭主程序进程,启动更新程序。这个步骤可通过两种方式实现 1、在主程序中写个函数,关闭主程序进程时,同事启动更新程序,2、写个bat脚本(功能为关闭主程序,启动更新程序),在主程序中调用bat脚本,可根据自己爱好自行选择实现方式。本文采用第一种方式。

      C# 如何实现winform 软件自动更新程序功能

      END

    更新程序中实现

    1. 更新程序主要功能包括两个,一个是负责解压下载的文件到主程序目录,另一个功能是,关闭更新程序,启动主程序。

      C# 如何实现winform 软件自动更新程序功能

    2. 1.解压文件到主程序的更新目录:

      C#解压zip文件,有相应的DLL,本文使用的是ICSharpCode.SharpZipLib.dll,可以再网上搜索该DLL,然后调用其中的方法即可。在文件解压完成之后,需删除下载的临时更新文件,不然临时目录下文件积累过多,造成系统资源浪费。解压文件的实现如下所示。

      C# 如何实现winform 软件自动更新程序功能

    3. 2.关闭更新程序,重新启动主程序:文件解压完成之后,我们就完成的系统的更新。此时,关闭更新程序,启动主程序即可。

      C# 如何实现winform 软件自动更新程序功能

      END

    注意事项

    • 1.主程序中需要有系统版本常量,每次程序需要升级时,必须修改该常量的值,否则在检测数据库中版本时,无法检测到更新程序。

    • 2.需要更新的文件打包时,需打包成后缀名为.zip的压缩文件格式,否则解压时可能会导致解压失败。

    展开全文
  • WinForm客户端自动更新

    2015-06-25 11:38:25
    当服务器上的应用程序有所变动时,客户端程序就可实现自动更新更新精确到单个文件(包含dll),也就是说当服务器上增加了一个文件,那客户端就拷贝该文件,如果服务器上某文件有所修改,那么客户端就更新该文件。...
  • 需要在服务端搭建FTP服务器,保存上传的软件更新包,更新包内容有软件的软件版本信息,客户端主程序运行时候检测本地配置和服务端数据库软件版本,不一致,提示软件更新,启动更新程序,下载更新包,解压,替换
  • Winform程序自动更新我也是第一次做,网上找了自动更新的源码,后来又根据在网上看到的一些方法,自己试了很久,最终还是有写错误,所以花了钱让别人帮忙调试成功的,下面是我自己捣腾出来的,方便大家借鉴,如果有什么错误...
  • 实现Winfrom检查版本自动更新,主要实现了从服务器下载文件,检查版本号,自动覆盖原程序,之后自动重启等功能,包含客户端程序和服务端文件
  • 提供一些关于自动更新的demo,主要是有注释,能运行的起来,新手求帮助,谢谢恩,有server程序,客户端程序
  • Winform 自动更新

    热门讨论 2012-04-20 16:44:03
    AutoUpdater支持对Winfrom程序的完美升级。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,680
精华内容 9,072
关键字:

winform自动更新程序