【问题标题】:Auto update for WinForms applicationWinForms 应用程序的自动更新
【发布时间】:2010-09-13 10:44:24
【问题描述】:

在为 .NET WinForms 应用程序创建自动更新功能时,它如何更新 DLL 而不影响当前运行的应用程序?

由于应用程序在更新过程中运行,不会对 DLL 进行锁定(因为这些 DLL 在更新过程中必须被覆盖)。

【问题讨论】:

  • @PeterMortensen 2008 年提出的问题与 2011 年提出的问题的重复程度如何?尤其是当它看起来包含更好的信息时

标签: winforms auto-update


【解决方案1】:

通常您会将新文件下载到单独的区域。然后关闭并重新启动,并在启动时查找并使用新文件(如果找到)。始终保留最后一个已知的工作版本,以便用户可以在下载导致问题时恢复到绝对有效的版本。

ClickOnce 是来自 Microsoft 的一项很好的技术,可以为您执行此操作,您可以直接在 Visual Studio 2008 中使用它。

【讨论】:

  • 您可以同时查看两者并决定哪个最适合您。 ClickOnce 开箱即用,但您对它的控制有限。使用 Updater 应用程序块需要更多的努力,但您拥有更多的控制权,因为您可以随时更改源代码。
  • ClickOnce 仅适用于用户(而非机器范围)安装。更强大的解决方案是 Google Omaha:github.com/google/omaha
【解决方案2】:

正如其他人已经评论的那样,您必须关闭应用程序并重新启动它。

我编写了一个开源代码以透明模式执行此操作 - 包括执行实际冷更新的外部更新应用程序。见http://www.code972.com/blog/2010/08/nappupdate-application-auto-update-framework-for-dotnet/

代码位于http://github.com/synhershko/NAppUpdate(根据 Apache 2.0 许可授权)

【讨论】:

    【解决方案3】:

    我有一个单独的“启动器”应用程序,它通过网络服务检查更新。如果有更新,它会下载它们,然后执行我的应用程序,该应用程序位于单独的程序集中。

    其他替代方法是使用 ClickOnce 之类的东西,或者将文件下载到单独的区域并重新启动应用程序,正如其他人提到的那样。

    不过,请注意 ClickOnce - 它并不像听起来那么灵活。如果您部署到需要将程序提升到更高安全级别才能运行的系统,如果您没有安装应用程序的证书,您可能会遇到问题。当谈到 ClickOnce 时,我发现很难在 Internet 上获得证书管理等问题的直接答案。如果您有一个复杂的应用程序,您可能只想推出自己的更新程序,这是我最终不得不做的。

    【讨论】:

    • 为什么要使用网络服务来检查更新?网络客户端更快不是吗?
    【解决方案4】:

    如果您通过 ClickOnce 发布,所有这些都将由您处理。它有自己的优点和缺点,但通常比尝试自己编写代码更容易。

    Wikipedia15seconds 都提供了有关使用 ClickOnce、其工作原理等方面的不错信息。

    正如其他人所说,ClickOnce 不像滚动您自己的解决方案那样灵活,但它要简单得多。一开始它的学习曲线很短,但几乎所有东西都捆绑到 Visual Studio 中并使用向导,通常很快就能找到一个可行的解决方案。

    随着部署变得越来越复杂(即不仅仅是拥有需要更新的先决条件或应用程序代码)并且您需要执行大量安装后或安装前任务,WiX 之类的东西可以为您提供一些Windows Installer 和 ClickOnce 之间的混合解决方案,灵活性成本是一个更陡峭的学习曲线。

    我尽量避免使用自定义安装程序的唯一原因是,您最终会花费太多时间来尝试恰到好处来处理一堆不同的“假设”场景......

    【讨论】:

      【解决方案5】:

      如果您的应用打包在 MSIX 包中,现在 Windows 可以使用 AppInstaller 自动为您执行此类更新。

      它将新版本的应用程序下载到ProgramFiles\WindowsApps 内的另一个文件夹中,然后当用户通过开始菜单运行应用程序时,系统知道它应该使用哪个文件夹。以前的版本在不使用时会被删除。

      如果您想知道如何以这种方式打包您的应用程序,我在this answer 中收集了我的发现。

      【讨论】:

        最近更新 更多