程序更新代码问题

本文关键字:问题 代码 更新 程序 | 更新日期: 2023-09-27 18:27:21

大家好

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

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

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

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

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

        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. 使用File重命名正在运行的可执行文件。移动到类似my.exe.bak的位置
  2. 将更新后的可执行文件放在旧文件的位置
  3. 使用Process.Start("my.exe")启动新副本,然后退出旧副本
  4. 启动时测试my.exe.bak是否存在,并尝试删除它。第一次不会成功,但备份最终会被删除

这样你就不需要任何.bat的把戏了。

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