启动一个新进程并终止创建它的进程

时间:2014-04-16 21:48:37

标签: c# process installer

我有一个应用程序(WinForms C#),我想在其中复制一些文件来自"下载"目录进入ProgramFiles目录。基本上我试图通过滚动我自己的自动更新程序来更新一些(或所有)当前正在运行的程序dll和可执行文件。

因此,我让应用程序自动检查更新并将更新下载到ProgramData \ MyApplication目录中。问题是,我需要在相应的ProgramFiles \ MyApplication目录中覆盖应用程序的所有文件,包括当前正在运行的.exe。有关如何执行此操作的任何想法吗?

1 个答案:

答案 0 :(得分:2)

正确编写自我更新应用程序 并非易事。您在问题中提到的大多数问题,例如正在使用的文件等。

从反复试验中我发现最好的方法(大致)是:

  1. 使用等待句柄在应用程序中创建系统范围的事件,该句柄可以侦听从另一个进程关闭的请求。
  2. 通过MSI安装程序打包应用程序。
  3. 使用%TEMP%文件夹中的引导程序将信号发送到第一个应用程序,然后启动MSI安装程序。
  4. MSI将处理为您实际更新应用程序的所有其他艰苦工作,处理文件锁等。
  5. 不幸的是,自我更新应用程序的问题在于,除非您将所有这些设计为与v1一起使用(并在使用假v1.1发布之前对其进行测试),否则您将发现需要使用旧版本的功能版本,以帮助更新到新版本。

    如果MSI安装程序不是一个选项,那么在临时目录中运行的可以进行交换,进程终止等的引导应用程序是一种很好的启动方式。

    根据您的应用程序设计,您可能还需要确保自我更新过程在Windows Vista及更高版本上升级,以便它可以写入%PROGRAMFILES%等目录来执行文件写入。