Web 服务 - 更新 C# 应用程序替换.exe文件

本文关键字:替换 exe 文件 应用程序 服务 更新 Web | 更新日期: 2023-09-27 17:56:49

我已经设法让我的应用程序在我的服务器上使用WebService检查更新,它会查看是否有任何更新要进行。但是我现在面临的真正问题是我不知道如何下载我的应用程序的较新版本.exe并替换我正在运行的当前版本。

总之,我需要知道如何下载我的应用程序的较新版本.exe并替换我正在运行的当前版本。

Web 服务 - 更新 C# 应用程序替换.exe文件

实际上,您需要创建一个单独的进程来处理更新步骤。我曾经开发过一个桌面应用程序,能够从 Web 服务器接收更新,我通过创建一个不同的进程作为主应用程序的主要入口点来做到这一点。

它会在保持运行以检查更新的同时启动主应用程序进程。然后,如果有任何可用的更新,它会将它们下载到临时文件夹中,然后在关闭它之前通知主应用程序,然后提交新的更新并再次重新启动主应用程序。

但是,如果您想坚持使用一个可执行文件和一个进程。我想您无法在运行时替换操作系统本身不允许的任何可执行文件。

您需要创建一个单独的引导应用程序来为您完成工作,否则应用程序正在运行,因此操作系统将阻止您覆盖它。

嗯,其实是有办法的。我几年前就发现了它。

不能删除当前正在执行的程序文件.exe。 但是你可以移动它。

因此,我将更新文件从我的Web服务器下载到一个 /更新/我的程序.exe

然后我 1) 文件.删除任何以前的 myprogram.bak 文件 2) File.move the myprogram.exe to myprogram.bak. 3) File.将/updates/myprogram.exe 复制到/myprogram.exe 位置。 4) 询问用户是否要重新启动,调用 Application.Restart()

瞧。 主程序中的问题已解决。无需启动程序。

您可以使用CMD而不是使用其他进程来替换正在运行的exe文件。首先,您必须运行MyApp.exe。您的MyApp.exe必须检查更新,下载并将文件解压缩到%AppData%//Temp文件夹。然后,您的 MyApp.exe 启动 CMD 命令(见下文),该命令关闭旧的 MyApp.exe,将所有文件复制到 MyApp.exe 文件夹并启动新版本的 MyApp.exe。所以CMD充当安装程序。

var exePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
var exeFolderPath = Path.GetDirectoryName(exePath);     
var command = "ping 127.0.0.1 -n 2 > nul & echo '"Done!'" & taskkill /f /t /im "
                + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name 
                + ".exe & ping 127.0.0.1 -n 2 > nul & xcopy '""
                + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 
                + "''Temp'''" '""+ exeFolderPath + "'" /h /i /c /k /e /r /y & call '"cmd /c start "
                + exeFolderPath + "''"
                + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".exe'" & echo '"Enjoy the new version...'" & pause";

System.Diagnostics.Process.Start("CMD.exe", "/K " + command);