C# 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
/// 窗体加载实现的操作
/// </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