开发系统时,很多时候都要开发系统升级程序。升级程序的方式大多相同。目前我开发一个升级程序是这样的。启动主程序的同时启动升级程序,通过升级程序获取服务器上版本配置文件,判断当前的系统版本是否最新的版本。若是最新版本,则升级程序关闭。否则弹出提示有新版本需要下载,然后远程服务器上下载新版本,下载后提示关闭正在运行的主程序,使用新版本覆盖旧版本程序,并将配置文件中的版本号更新为最新程序的版本号。
下面贴出我开发的升级程序的部分代码:
/// <summary>/// 检查是否有更新
/// </summary>
public void checkUpdate()
{
string updateUrl = "http://172.16.10.199:8040/DownloadWinecooler/update.xml";//升级配置的XML文件地址
if (ConfigurationManager.AppSettings["updateUrl"] != null)
{
updateUrl = ConfigurationManager.AppSettings["updateUrl"].ToString();
}
TextLog.AppendText(updateUrl);
TextLog.AppendText("\r\n");
//将信息写入到日志输出文件
string strOuput = string.Format("Url:{0}!\n", updateUrl);
SoftUpdate.TP_WriteAppLogFile(SoftUpdate.g_AppLogFileName, strOuput);
SoftUpdate app = new SoftUpdate(Application.ExecutablePath, "Update", updateUrl);
app.UpdateFinish += new UpdateState(app_UpdateFinish);
try
{
//if (app.IsUpdate && MessageBox.Show("检查到新版本,是否更新?", "Update", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
if (app.IsUpdate)
{
strOuput = string.Format("有新版本,正在下载中...\n");
TextLog.AppendText(strOuput);
//将信息写入到日志输出文件
SoftUpdate.TP_WriteAppLogFile(SoftUpdate.g_AppLogFileName, strOuput);
Thread update = new Thread(new ThreadStart(app.Update));
update.Start();
}
else
{
strOuput = string.Format("已经是最新版本了\n");
TextLog.AppendText(strOuput);
//将信息写入到日志输出文件
SoftUpdate.TP_WriteAppLogFile(SoftUpdate.g_AppLogFileName, strOuput);
RestartPC();
}
}
catch (Exception ex)
{
ex.ToString();
//MessageBox.Show(ex.Message);
strOuput = string.Format("下载出错啦!\n");
TextLog.AppendText(strOuput);
//将信息写入到日志输出文件
SoftUpdate.TP_WriteAppLogFile(SoftUpdate.g_AppLogFileName, strOuput);
RestartPC();
}
}
/// <summary>
/// 更新完成
/// </summary>
/// <param name="strPathName"></param>
void app_UpdateFinish(string strPathName)
{
filename = strPathName;
string strOuput = string.Format("更新完成!\n");
TextLog.AppendText(strOuput);
//将信息写入到日志输出文件
SoftUpdate.TP_WriteAppLogFile(SoftUpdate.g_AppLogFileName, strOuput);
//然后更新新程序
PostMessage(this.Handle, MYMESSAGE_UPDATE, "", ""); //发用户自定义消息
}
/// <summary>
/// 重写窗体的消息处理函数DefWndProc,从中加入自己定义消息 MYMESSAGE_UPDATE 的检测的处理入口
/// </summary>
/// <param name="m"></param>
protected override void DefWndProc(ref Message m)
{
switch (m.Msg)
{
//接收自定义消息MYMESSAGE,并显示其参数
case MYMESSAGE_UPDATE:
{
//KillProcess("calc.exe");//计算器的例子
string strOuput = string.Format("准备用新版本的的程序覆盖旧程序,关闭当前酒柜系统\n");
//将信息写入到日志输出文件
SoftUpdate.TP_WriteAppLogFile(SoftUpdate.g_AppLogFileName, strOuput);
KillProcess("SysMain");//
strOuput = string.Format("启动刚才下载的安装包覆盖旧版本程序,当前新版本为:{0}\n",SoftUpdate.newVerson);
ConfigManager.UpdateOrCreateAppSetting("Main.exe.config", "Version", SoftUpdate.newVerson);
//将信息写入到日志输出文件
SoftUpdate.TP_WriteAppLogFile(SoftUpdate.g_AppLogFileName, strOuput);
ShellExecute(0, "open", filename, "", "", ShowCommands.SW_SHOWNORMAL);
Thread.Sleep(1000);
//输出的调试字符串
strOuput = string.Format("更新酒柜客户端系统完成,准备重新启动电脑\n");
//将信息写入到日志输出文件
SoftUpdate.TP_WriteAppLogFile(SoftUpdate.g_AppLogFileName, strOuput);
RestartPC();
}
break;
default:
base.DefWndProc(ref m);
break;
}
}