using DevExpress.XtraEditors; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; using Updater.Core; namespace Update { public partial class Form1 : DevExpress.XtraEditors.XtraForm { //主程序传入的参数,系统标示 是否需要重新启动主程序 private string[] args; //表示主程序打开时传入的参数 private readonly static string OPEN_FLAG = "121"; private bool isComplete = true; private UpdateClass updater; private List mList = new List(); private int mLen = 0; public Form1() { InitializeComponent(); } private void simpleButton1_Click(object sender, EventArgs e) { } private void simpleButton1_Click_1(object sender, EventArgs e) { for (int i = 0; i <= 100; i++) { System.Threading.Thread.Sleep(10); //progressBarControl1.PerformStep(); progressBarControl1.Position = i; lab_percent.Text = i + "%"; //progressBarControl1.EditValue = i + 1; //处理当前消息队列中的所有windows消息,不然进度条会不同步 System.Windows.Forms.Application.DoEvents(); } } private void Form1_Load(object sender, EventArgs e) { try { updater = new UpdateClass(); updater.ActivationCompleted += new EventHandler(ActivationCompleted); updater.ActivationError += new EventHandler(ActivationError); updater.ActivationInitializing += new EventHandler(ActivationInitializing); updater.ActivationProgressChanged += new EventHandler(ActivationProgressChanged); updater.ActivationStarted += new EventHandler(ActivationStarted); updater.DownloadCompleted += new EventHandler(DownloadCompleted); updater.DownloadError += new EventHandler(DownloadError); updater.DownloadProgressChanged += new EventHandler(DownloadProgressChanged); InitUpdater(); } catch (Exception ex) { Log.Write("更新错误:" + ex.Message); XtraMessageBox.Show("更新错误", "系统提示"); } } void ActivationCompleted(object sender, ActivationCompletedEventArgs e) { //安装完成 isComplete = true; lab_filename.Text = "安装完成"; lab_percent.Text = "100%"; if (progressBarControl1.Position != 100) { progressBarControl1.Position = 100; } if (e.Error != null) { lab_filename.Text += ",但出现错误"; lab_filename.Update(); } else { lab_filename.Update(); System.Threading.Thread.Sleep(3000); string filename = GetFileName(e.Manifest.MyApplication.Location, e.Manifest.MyApplication.EntryPoint.File); Startup(filename, e.Manifest.MyApplication.EntryPoint.Parameters); //if (args != null && args.Length > 0) { Exit(); } } } private string GetFileName(string location, string file) { return Path.Combine(Path.GetFullPath(location), file); } void ActivationError(object sender, FileCopyErrorEventArgs e) { Log.Write("安装过程中出现错误,错误描述:" + e.Error.Message + System.Environment.NewLine + "Version:" + e.Manifest.Version); XtraMessageBox.Show(this, "安装错误:" + e.Error.Message, "系统提示"); lab_filename.Text = "系统正在回滚"; updater.Rollback(e.Manifest); } void ActivationInitializing(object sender, ManifestEventArgs e) { lab_filename.Text = "正在初始化安装,请稍后......"; lab_filename.Update(); lab_percent.Text = "0%"; lab_percent.Update(); lab_fileinfo.Text = ""; lab_fileinfo.Update(); //progressBar1.Value = 0; } void ActivationProgressChanged(object sender, FileCopyProgressChangedEventArgs e) { progressBarControl1.Position = e.ProgressPercentage; lab_percent.Text = e.ProgressPercentage.ToString() + "%"; lab_percent.Update(); lab_fileinfo.Text = string.Format("字节数:{0}/{1}", e.BytesToCopy, e.TotalBytesToCopy); lab_fileinfo.Update(); lab_filename.Text = "正在安装:" + e.SourceFileName; lab_filename.Update(); } void ActivationStarted(object sender, ActivationStartedEventArgs e) { lab_filename.Text = "开始安装,请稍后......"; lab_filename.Update(); e.Cancel = CheckActivation(); if (e.Cancel) { lab_filename.Text = "安装已被取消"; isComplete = true; } } private bool CheckActivation() { bool cancel = false; //检查主程序(进程名称)是否打开,如果打开则提示 string[] processName = { "Client", "Server" }; foreach (string name in processName) { System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName(name); if (processes != null && processes.Length != 0) { if (XtraMessageBox.Show(string.Format("进程{0}正在运行中,请关闭后重试。", name), "系统提示", MessageBoxButtons.RetryCancel, MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.Cancel) { cancel = true; break; } else { return CheckActivation(); } } } return cancel; } /// /// 文件下载完毕执行的操作 /// void DownloadCompleted(object sender, DownloadCompleteEventArgs e) { mList.Add(e.Manifest); if (mList.Count == mLen) { updater.Activate(mList.ToArray()); mList.Clear(); } } void DownloadError(object sender, DownloadErrorEventArgs e) { Log.Write("下载过程中出现错误,错误描述:" + e.Error.Message + System.Environment.NewLine + "Version:" + e.Manifest.Version); XtraMessageBox.Show("下载出错:" + e.Error.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } void DownloadProgressChanged(object sender, DownloadProgressEventArgs e) { progressBarControl1.Position = e.ProgressPercentage; lab_percent.Text = e.ProgressPercentage.ToString() + "%"; lab_percent.Update(); lab_fileinfo.Text = string.Format("字节数:{0}/{1}", e.BytesReceived, e.TotalBytesToReceive); lab_fileinfo.Update(); lab_filename.Text = "正在下载文件:" + e.FileName; lab_filename.Update(); } private void InitUpdater() { //从配置文件动态设置更新标题 UpdaterConfigurationView updateCfgView = new UpdaterConfigurationView(); var manifests = updater.CheckForUpdates(); mLen = manifests.Length; if (updater.HasNewVersion) { //显示本次更新内容 string updateDescription = manifests[0].Description; this.lblUpdateLog.Text = string.Format("更新说明:{0}", updateDescription); if (args != null && args.Length > 0) { #region 关闭主程序 try { string entryPoint = manifests[0].MyApplication.EntryPoint.File; KillProcessDos(entryPoint); } catch (Exception ex) { Log.Write(ex.ToString()); } #endregion } isComplete = false; updater.DownloadAsync(manifests); } else { lab_filename.Text = ""; XtraMessageBox.Show("您当前的版本已经是最新,不需要更新。", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information); Exit(); } } /// /// 使用DOS关闭进程 /// /// 进程名称 private void KillProcessDos(string processName) { RunCmd("taskkill /im " + processName + " /f "); } /// /// 系统退出 /// private void Exit() { this.Close(); Environment.Exit(0); } /// /// 带参数启动指定的应用程序 /// /// 入口的应用程序 /// 程序启动参数 private void Startup(string entryPoint, string parameters) { try { // if (args != null && args.Length > 0) { // if (args[0] == OPEN_FLAG) { //关闭主程序 ExeCommand("taskkill /im " + Path.GetFileName(entryPoint) + " /f "); //启动主程序 System.Threading.Thread.Sleep(1000); System.Diagnostics.Process.Start(entryPoint, parameters); } } } catch (Exception ex) { Log.Write(ex); } } /// /// DOS命令运行函数 /// /// private void ExeCommand(string commandText) { Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; try { p.Start(); p.StandardInput.WriteLine(commandText); p.StandardInput.WriteLine("exit"); //p.StandardOutput.ReadToEnd(); } catch { } } /// /// 运行DOS命令 /// DOS关闭进程命令(ntsd -c q -p PID )PID为进程的ID /// /// /// private void RunCmd(string command) { //實例一個Process類,啟動一個獨立進程 System.Diagnostics.Process p = new System.Diagnostics.Process(); //Process類有一個StartInfo屬性,這個是ProcessStartInfo類,包括了一些屬性和方法,下面我們用到了他的幾個屬性: p.StartInfo.FileName = "cmd.exe"; //設定程序名 p.StartInfo.Arguments = "/c " + command; //設定程式執行參數 p.StartInfo.UseShellExecute = false; //關閉Shell的使用 p.StartInfo.RedirectStandardInput = true; //重定向標準輸入 p.StartInfo.RedirectStandardOutput = true; //重定向標準輸出 p.StartInfo.RedirectStandardError = true; //重定向錯誤輸出 p.StartInfo.CreateNoWindow = true; //設置不顯示窗口 p.Start(); //啟動 //p.StandardInput.WriteLine(command); //也可以用這種方式輸入要執行的命令 //p.StandardInput.WriteLine("exit"); //不過要記得加上Exit要不然下一行程式執行的時候會當機 p.StandardOutput.ReadToEnd(); //從輸出流取得命令執行結果 while (!p.HasExited) { p.WaitForExit(1000); } } } }