11

我们有一个最小的“更新程序”exe,它检查远程 URL 的更新、下载它们并在启动真正的应用程序之前替换磁盘上的文件。但是,如果我们想替换更新程序 EXE,那么 AFAIK 我们有两个选择:

  1. 影子复制程序集,.Net 将创建 EXE(和任何引用的程序集)的影子副本并加载这些程序集,以便可以替换非影子程序集并在下次启动应用程序时使用。

  2. 确定哪些文件被替换并在磁盘上重命名/移动它们。Windows 似乎允许重命名/移动锁定的文件,因此我们可以移动文件并复制到新的程序集中。同样,在下次启动应用程序时,我们将启动新程序集。这里提到了这种方法

这第二种方法是推荐的方法吗?这种方法有什么陷阱吗?

4

6 回答 6

10

另一种选择:当主应用程序想要更新自己时,它会产生一个新的更新程序进程,然后关闭自己。与此同时,生成的进程等待主应用程序关闭(进程消失),然后更新所有必要的文件(包括 .exe)。之后,它只是重新启动主应用程序并退出更新程序进程。

于 2009-07-31T11:07:33.897 回答
9

我使用第二种方法没有任何问题。只需确保正确下载了下载的程序集。;)

运行 Update.exe 并让它这样做:

  1. 下载新的 update.exe 作为 update.ex_
  2. 将 update.exe 重命名为 update.bak(可以重命名,但不能覆盖)
  3. 将 update.ex_ 重命名为 update.exe
  4. 重启更新.exe

我这样做完全没有问题,因此在我们说话时,它已在大约 400 名客户的实时环境中进行了测试和运行。

于 2009-07-31T11:20:39.593 回答
6

ClickOnce部署怎么样?

于 2009-07-31T11:24:44.827 回答
3

在我从事的一个项目中,有 2 个可执行文件。我们称它们为 A 和 B。

A 存在的唯一原因是启动 B。因此,当 B(“真正的”应用程序)下载更新时,它能够在必要时替换 A。

如果应用程序重新启动(通过 A),A 检查 B 是否在启动 B 之前下载了一些文件并替换了它们。

于 2009-07-31T11:43:52.497 回答
1

我们使用内部应用程序的方式:

应用程序快捷方式指向更新程序。

  1. 显示停机通知/截止日期消息。
  2. 更新程序执行更新检查。
  3. 更新已下载并安装。
  4. 应用程序启动。
  5. 应用程序执行更新程序的更新(检查 /update 文件夹中的 Updater.fp7.gz)

编辑:糟糕 - 错过了第 5 步。

于 2009-07-31T11:24:58.150 回答
0

我大多同意Stefan 的回答,除了如果您想在 Windows Vista 或 Windows 7 上正确处理 UAC 并且您的应用程序已正确安装在 Program Files 文件夹下或需要安装其他需要提升权限的依赖项,它可能无法正常工作。

在这种情况下,您要么执行基于 msi 的安装/修补程序,要么安装以必要的安全性运行的 Windows 服务,以覆盖 Program Files 文件夹中的文件。

如果您的应用程序是交互式的,另一种选择是按照 Igor Brejc 的建议进行操作,并生成一个执行更新的新进程,这使您的应用程序有机会在更新期间提示提升权限。使用上面提到的补丁或 Windows 服务选项将提供更好的用户体验,无论场景如何(交互式/非交互式)。

于 2012-04-25T17:09:12.690 回答