Winform开发框架之通用自动更新模块

在网络化的环境中,特别是基于互联网发布的Winform程序,程序的自动更新功能是比较重要的操作,这样可以避免挨个给使用者打电话、发信息通知或者发送软件等,要求其对应用程序进行升级。实现程序的自动更新,在后期发布维护过程中,一个可以快速相应修正相关的Bug或者增加功能,二个可以避免给使用客户隔三差五的发送修改好的程序,省心省力。本文也是基于这个思想,在Winform开发框架中再引入一个自动升级更新的通用模块,这个自动升级的通用模块除了具备一般的功能外,可以通过配置程序标题、升级路径方式等方式,实现通用化的升级操作,其他需要升级的程序,拿过来就可以使用,经过项目的整合及优化,已经具备较好的应用前景了。

本通用自动更新模块具有下面几个特点:

1)程序标题可配置,更新路径可配置,适用于各种需要更新的项目整合。

2)支持文件复制或者对压缩包进行解压,适合更多琐碎程序集的整体升级。

3)支持文件更新后自动启动,或者带参数的启动方式。


下面是我的Winform开发框架中集成通用自动更新模块的截图,如下所示。 

 

更新过程中会先关闭主程序,把更新的Zip文件下载后进行自动解压,然后启动主程序。 


 

自动更新一般需要设置一些参数,如程序标题、更新地址路径、版本号等,本通用自动更新的XML文件如下所示。
 

自动更新虽然可以独立进行执行并更新,不过一般会在主程序中加入对自动更新的判断(毕竟使用客户大多数都是会运行主程序的),实现自动更新判断及执行,我们可以把其放到一个后台线程中执行判断,这样可以提供用户的体验,不会中断界面操作,我一般倾向于把自动更新放到登录界面的首页上,这样用户每次登录的时候,可选择性进行更新,登录后一般要进行业务操作,如果更新退出可能会导致客户的一些重要数据没有保存而丢失,这样影响不好。

        /// <summary>
        
/// 窗体加载实现的操作
        
/// </summary>
        private void Logon_Load(object sender, EventArgs e)
        {
            .......................

            #region 更新提示/判断是否自动更新
            updateWorker = new BackgroundWorker();
            updateWorker.DoWork += new DoWorkEventHandler(updateWorker_DoWork);
            updateWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updateWorker_RunWorkerCompleted);

            string strUpdate = config.AppConfigGet("AutoUpdate");
            if (!string.IsNullOrEmpty(strUpdate))
            {
                bool autoUpdate = false;
                bool.TryParse(strUpdate, out autoUpdate);
                if (autoUpdate)
                {
                    updateWorker.RunWorkerAsync();
                }
            }
            #endregion
        }

        #region 更新提示线程处理
        private void updateWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //MessageUtil.ShowTips("版本更新完成");
        }

        private void updateWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                UpdateClass update = new UpdateClass();
                bool newVersion = update.HasNewVersion;
                if (newVersion)
                {
                    if (MessageUtil.ShowYesNoAndTips("有新的版本,是否需要更新") == DialogResult.Yes)
                    {
                        Process.Start(Path.Combine(Application.StartupPath, "Updater.exe"), "121");
                        Application.Exit();
                    }
                }
                
            }
            catch (Exception ex)
            {
                MessageUtil.ShowError(ex.Message);
            }
        }
        #endregion


上面是介绍我Winform开发框架中应用的自动更新模块,当然经验丰富的你可能也有自己的更新模块,或者比这个更具有一些亮点的地方,这样的话非常开心大家一起交流研究。

本人多年来一直致力于开发一些共享软件,如送水管理系统、酒店管理系统、仓库管理系统、配电网络可视化管理系统、病人资料管理系统,以及一些小型的软件,如QQ搜通天、易博搜搜、赶集小神童、绿苗帮电脑监控系统等,以及在日常中,也是从事一些较为大型系统的开发工作。一直以来,有一个想法,就是尽可能利用好的、经过淬炼的技术,以及日常积累的经验所得,构建一个Winform开发框架的生态体系,目前这些体系基本上已经完整实现,并应用在实际项目和共享软件当中,并在实际中历练和升华。
这个体系包括有:
  1)Database2Sharp代码生成工具,用来辅助生成复杂的架构基础代码,以及日常的一些琐碎反复的工作。
  2)一个稳定成熟、反复应用过的Winform开发框架,集成应用程序必备的一些常用操作,新的业务系统只需要在其上面按既定的模式叠加业务操作即可,提供框架的可用性、稳定性以及完善性。
  3)提供一个所有业务系统都很常见的权限管理系统以及一个也很常见的字典数据管理模块。这两个模块是组件化的模块,既相互独立,又可以和Winform框架进行集成,供业务系统重复调用。
  4)一个集成多年经验积累、反复优化提炼的公用类库,类库封装日常开发所应用到的方方面面,如一把瑞士军刀,一个个奇兵,各有用处。
  5)一系列界面控件的整合效果,提供各种报表生成的解决方案(普通二维报表、自定义模板报表、复杂报表等高级功能。
  6)提供一个封装日常数据显示的分页控件,集成高性能的数据分页显示、数据打印、数据导出、常用数据操作等接口功能。
  7)提供一个通用的程序自动更新模块,更快、更便捷实现程序的自动更新,避免挨个给使用者打电话、发信息通知或者发送软件等,要求其对应用程序进行升级。

  8)基于上面第2点的Winform开发框架及整合所有通用模块,开发基于互联网软件发布模式的WCF开发框架,构建一个安全、高效、便捷、分布式的业务管理系统。 

 

如果你对我的Winform开发框架有兴趣,还可以阅读下面几篇文章,如下:

Winform开发框架之字典数据管理

 Winform开发框架之权限管理系统 

 Winform开发框架之终极应用 

Winform开发框架之Office Ribbon界面
基于我的Winform开发框架扩展而成的WCF开发框架

 

主要研究技术:代码生成工具、Visio二次开发、送水管理软件等共享软件开发
专注于Winform开发框架、WCF开发框架的研究及应用。
  转载请注明出处:
撰写人:伍华聪  http:
//www.iqidi.com 
    

posted on 2011-11-13 22:07 伍华聪 阅读(4993) 评论(24) 编辑 收藏

评论

#1楼  回复 引用 查看   

远程下载的,是否需要用到 FTP下载,还是用HTTP呢??
2011-11-13 22:42 | Mark Dzone      

#2楼[楼主]  回复 引用 查看   

引用Mark Dzone:远程下载的,是否需要用到 FTP下载,还是用HTTP呢??

使用HTTP协议下载即可
2011-11-13 22:44 | 伍华聪      

#3楼  回复 引用 查看   

不错,顶一下。

#4楼  回复 引用 查看   

UAB 2.0
2011-11-13 23:50 | Snafor.Net      

#5楼  回复 引用 查看   

不错。
2011-11-14 08:24 | zesion      

#6楼  回复 引用 查看   

你好 你的博客非常好 谢谢了 我学到不少东西呢...
2011-11-14 08:34 | renxs      

#7楼  回复 引用 查看   

引用Mark Dzone:远程下载的,是否需要用到 FTP下载,还是用HTTP呢??

亏你还提出这样的问题,诶!!!
2011-11-14 08:37 | 海洋之 心      

#8楼  回复 引用 查看   

自动更新有点不好控制版本, 楼主可以多说些这方面的。
2011-11-14 08:48 | 518      

#9楼[楼主]  回复 引用 查看   

引用renxs:你好 你的博客非常好 谢谢了 我学到不少东西呢...

非常感谢支持,能学到东西,荣幸之至
2011-11-14 08:51 | 伍华聪      

#10楼[楼主]  回复 引用 查看   

引用Snafor.Net:UAB 2.0

UAB2.0 确实也可以做到,不过比较简单一点,需要改造好一点才能用。
2011-11-14 08:55 | 伍华聪      

#11楼  回复 引用 查看   

现成的 click once 不用?
2011-11-14 09:14 | cnlcg      

#12楼  回复 引用 查看   

1
2011-11-14 09:41 | SearchFriend      

#13楼  回复 引用 查看   

能提供demo下载么?谢谢博主的文章
qq76373
2011-11-14 10:04 | RichieLiu      

#14楼  回复 引用 查看   

很好的文章。
2011-11-14 11:09 | 海南.胡勇      

#15楼  回复 引用 查看   

@海洋之 心
自动更新早过了,只是了解一下楼主支持的是哪几种协议而已,还没看清楚就别口出狂言!
2011-11-14 11:42 | Mark Dzone      

#16楼  回复 引用 查看   

UAC那关过得了不?

#17楼  回复 引用 查看   

学习了
2011-11-14 13:16 | 天行健 自强不息      

#18楼  回复 引用 查看   

楼主每次提供的思路很好,但是 如果可以同时提供一个小demo就更好了,
跟吉日 风格一样~
2011-11-14 14:04 | weishao.NET      

#19楼  回复 引用 查看   

路过学习了
2011-11-14 14:34 | 阿佑      

#20楼  回复 引用 查看   

1.楼主把中间的一个重要类UpdateClass贴上就更完美了。
2.最好升级完成后程序能自动启动。
2011-11-14 15:55 | onekey      

#21楼  回复 引用 查看   

登录哦,不是登陆,看到了个小问题。
2011-11-14 17:35 | 杨盛超      

#22楼  回复 引用 查看   

支持一下楼主
2011-11-14 20:05 | 南京.王清培      

#23楼  回复 引用 查看   

引用Mark Dzone:
@海洋之 心
自动更新早过了,只是了解一下楼主支持的是哪几种协议而已,还没看清楚就别口出狂言!

出了又能如何嘛?
2011-11-15 08:41 | 海洋之 心      

#24楼  回复 引用 查看   

自动更新可以单独写一个程序,在main入口接受参数,获取更新地址,和更新内容,下载完后启动的程序路径,就可以在任何程序里通用了
2011-11-16 17:00 | 十年一刻·i      

导航

<2011年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

公告

昵称:伍华聪
园龄:6年7个月
荣誉:推荐博客
粉丝:676
关注:23

搜索

 

常用链接

最新随笔

我的标签

随笔档案(202)

文章分类(14)

文章档案(15)

相册

我的好友

我的技术支持站点(http://www.iqidi.com)

积分与排名

  • 积分 - 629355
  • 排名 - 79

最新评论

阅读排行榜

评论排行榜

推荐排行榜