编程语言
首页 > 编程语言> > C#-程序更新代码问题

C#-程序更新代码问题

作者:互联网

嘿大家.

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

>程序将下载其中包含版本字符串的远程文件.如果版本字符串大于程序的版本字符串,则会启动自动更新.
>该程序使用带有DownloadAsync的远程链接下载该程序的最新版本.
>该程序将创建一个新的批处理文件,该文件将终止当前应用程序(程序本身),删除当前程序,并将新程序重命名为应用程序的名称.然后,它运行新的更新的应用程序并删除自身.

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

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

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

你能指出我的错误吗?我正在尝试找出问题所在!

谢谢!

解决方法:

如果程序包含一个可执行文件,则有一种更简便的方法来更新程序:

>使用File.Move将正在运行的可执行文件重命名为my.exe.bak.
>将更新的可执行文件替换为旧的可执行文件.
>使用Process.Start(“ my.exe”)启动新副本,然后退出旧副本.
>启动后测试my.exe.bak是否存在,然后尝试将其删除.您不会第一次成功,但是备份将最终被删除.

这样,您将不需要任何.bat欺骗.

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

标签:auto-update,c
来源: https://codeday.me/bug/20191122/2063452.html