2014-04-16 34 views
1

的过程中,我有一个应用程序(的WinForms C#)中,我想一些文件从“下载”目录复制到PROGRAMFILES目录。本质上,我试图通过滚动我自己的自动更新程序来更新一些(或全部)当前正在运行的程序dll和可执行文件。启动一个新的进程,杀死创建它

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

+0

这是您的问题的解决方案。请查看[解决方案] [1]。 [1]:http://stackoverflow.com/questions/2335755/how-to-update-an-assembly-for-a-running-c-sharp-process-aka-hot-deploy –

+0

有趣的是,我正在考虑使用Process.Start(“PathToMyUpdaterExecutable”)启动进程,然后从主程序中调用Application.Exit()...你认为这是一个好方法吗? – Chadley08

+0

我这样建议你,因为你在寻找自我更新。更好的想法是使用标准方法,如martin_costello在下面回答你。 –

回答

2

写一个自我更新应用正确不是一个简单的任务。大多数时候,你在你的问题提的问题,如在使用等

从试验和错误的文件,我觉得最好的办法(大致)是:

  1. 在创建系统范围的事件使用等待句柄的应用程序可以侦听从另一个进程关闭的请求。
  2. 通过MSI安装程序打包应用程序。
  3. 使用引导应用%TEMP%文件夹到的信号发送给第一个应用程序,并启动MSI安装程序。然后
  4. 微星将处理的实际更新你的应用程序,处理文件锁等其他所有的辛勤工作

不幸的是,自我更新的应用程序的问题是,除非你设计了这一切与v1一起工作(并在发布之前使用假v1.1对其进行测试),那么您会发现需要旧版本中的功能才能帮助更新到新版本。

如果MSI安装程序不是一个选项,然后在临时目录中,可以做交换运行的引导程序,进程终止等是一个良好的开端。

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

+0

我的第一个想法是将一个单独的应用程序部署到从原始应用程序运行的软件(使用Process.Start()),并将相关的dll和exe复制/粘贴到程序文件文件夹。我认为这就是你在这里所说的“如果MSI安装程序不是一个选项,那么运行在临时目录中的引导程序应用程序可以进行交换,进程终止等等,这是一个很好的启动方式。”所以我会试一试。谢谢! – Chadley08

+0

没问题。只需提一下,我的确从一个直接更新另一个的应用程序开始,但它有一些可靠性问题,导致我将它更改为运行MSI安装程序的引导程序。这取决于您的安装足迹。我正在处理的应用程序有很多文件,并且还有一个配置文件来处理,有时候也需要在版本之间进行模式迁移。 –

+0

很高兴知道。我们将从updater的简单实现开始(只是替换dll和exe),我们可能会从那里扩展它。在我们继续前进并研究如何实施引导程序+ MSI安装程序时,我会牢记这一点。再次感谢。 – Chadley08