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