程序更新代码问题

时间:2013-08-13 04:48:50

标签: c# auto-update

嘿大家。

我开发了一个简单的代码来自动更新我的程序。它的工作方式是:

  1. 程序下载包含版本字符串的远程文件。如果版本字符串大于程序,则自动更新启动。

  2. 该程序使用带有DownloadAsync的远程链接下载最新版本的程序。

  3. 程序会创建一个新的批处理文件,该文件会终止当前应用程序(程序本身),删除当前程序,并将新程序重命名为应用程序的名称。然后,它运行新更新的应用程序并删除自己。

  4. 但是,实际执行批处理文件时,我遇到了问题。这是我的代码:

            private void WC_Completed(object sender, AsyncCompletedEventArgs e)
            {
    
            StringBuilder Batch = new StringBuilder();
            Batch.AppendLine("@echo off");
            Batch.AppendLine("taskkill /IM " + Process.GetCurrentProcess().ProcessName + ".exe /F");
            Batch.AppendLine("ping localhost > nul");
            Batch.AppendLine("del /f " +  (char)34 + Application.ExecutablePath + (char)34);
            Batch.AppendLine("ren " + (char)34 + Application.StartupPath + @"\update.exe" + (char)34 + " " + Process.GetCurrentProcess().ProcessName + ".exe");
            Batch.AppendLine((char)34 + Application.ExecutablePath + (char)34);
            Batch.AppendLine("del %0");
    
            File.WriteAllText(Application.StartupPath + @"\update.bat", Batch.ToString(), Encoding.Default);
            Process.Start(Application.StartupPath + @"\update.bat");
        }
    

    出于某种原因,它不会杀死当前的应用程序,或者它只需要太多,整个过程就会变得疯狂。它只运行未更新的应用程序,因为重命名不起作用,这会导致循环。

    你能指出我的错误吗?我想看看有什么不对!

    谢谢!

1 个答案:

答案 0 :(得分:3)

如果程序包含一个可执行文件,则更新程序更简单:

  1. 使用File.Move将正在运行的可执行文件重命名为my.exe.bak
  2. 将更新的可执行文件放在旧的可执行文件的位置。
  3. 使用Process.Start("my.exe")启动新副本并退出旧副本。
  4. 如果my.exe.bak存在,则在启动测试时尝试删除它。你第一次没有成功,但最终会删除备份。
  5. 这样您就不会需要任何.bat诡计。

    您还可以通过命令行参数将旧实例的PID(进程ID)传递给新实例,然后使用Process.GetProcessById(pid).WaitForExit();删除my.exe.bak来增强此算法在第一次启动和处理更新过程完成。