【问题标题】:Program update code issue程序更新代码问题
【发布时间】:2013-08-13 04:48:49
【问题描述】:

大家好。

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

  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");
    }

由于某种原因,它并没有杀死当前的应用程序,或者只是占用了太多时间,整个过程变得疯狂。它只是运行未更新的应用程序,因为重命名不起作用,这会导致循环。

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

谢谢!

【问题讨论】:

  • 我也想知道是否可以在 C# 中使用 Shell 函数,所以我可以创建一个 shell 批处理运行,这样它实际上可以被隐藏。

标签: c# auto-update


【解决方案1】:

如果程序由一个可执行文件组成,则有一种更简单的方法来更新程序:

  1. 使用File.Move 将正在运行的可执行文件重命名为my.exe.bak
  2. 用更新的可执行文件代替旧的。
  3. 使用Process.Start("my.exe") 启动新副本并退出旧副本。
  4. 在启动测试时,如果my.exe.bak 存在并尝试将其删除。第一次不会成功,但备份最终会被删除。

这样你就不需要任何.bat 诡计了。

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

【讨论】:

  • 重命名一个正在运行的可执行文件,这行得通吗?不是被进程锁住了吗?
  • @ulltor 是否可以重命名正在运行的应用程序?
  • 是的,有可能,我使用这种技术来更新我自己的 exe。正在运行的 exe 上允许移动操作,通常我会将 exe 移动到名为 old 的子文件夹中,以便稍后清理我的代码。这是非常在终端服务器上使用的,当每个人都退出并且你不想断开连接时很难得到一个时刻。
  • @ScottChamberlain 那么我到底应该怎么做呢?我正在使用 WebClient 下载新的可执行文件。用什么名字下载?我将如何继续改变它?什么时候改?等等?
  • 下载文件并将其保存为myExe.new,执行File.Move(Path.Combine(pathToExe, "myExe.exe"), Path.Combine(pathToExe, "myExe.old"));,然后执行File.Move(Path.Combine(pathToExe, "myExe.new"), Path.Combine(pathToExe, "myExe.exe"));。完成 exe shuffle 后,您只需启动新应用程序并关闭当前应用程序。如果您使用的是 WinForms,您可以致电 Application.Restart()
猜你喜欢
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
相关资源
最近更新 更多