启动一个新进程并终止创建它的进程
本文关键字:进程 终止 创建 新进程 一个 启动 | 更新日期: 2023-09-27 17:58:45
我有一个应用程序(WinForms C#),我想在其中将一些文件从"下载"目录复制到ProgramFiles目录中。从本质上讲,我试图通过滚动自己的自动更新程序来更新当前运行的部分(或全部)程序dll和可执行文件。
因此,我让应用程序自动检查更新,并将更新下载到ProgramData''MyApplication目录中。问题是,我需要覆盖应用程序对应的ProgramFiles''MyApplication目录中的所有文件,包括当前运行的.exe。你知道怎么做吗?
正确编写自更新应用程序不是一项简单的任务。你在问题中提到的大多数问题,例如使用中的文件等。
通过反复试验,我发现最好的方法(大致)是:
- 使用等待句柄在应用程序中创建系统范围的事件,等待句柄可以侦听来自另一个进程的关闭请求
- 通过MSI安装程序打包应用程序
- 使用
%TEMP%
文件夹中的引导应用程序将信号发送到第一个应用程序,然后启动MSI安装程序 - MSI将为您处理所有其他实际更新应用程序的艰苦工作,处理文件锁定等
不幸的是,自我更新应用程序的问题是,除非你将所有这些设计为使用v1(并在发布前使用伪造的v1.1进行测试),否则你会发现你需要旧版本中的功能来帮助更新到新版本。
如果MSI安装程序不是一个选项,那么在临时目录中运行的引导应用程序可以进行交换、进程终止等操作是一个很好的启动方式。
根据您的应用程序设计,您可能还需要确保自更新过程在Windows Vista及更高版本上提升自身,以便它可以写入%PROGRAMFILES%
等目录来进行文件写入。