WinForms应用程序的自动更新

WinForms应用程序的自动更新,winforms,auto-update,Winforms,Auto Update,为.NET WinForms应用程序创建自动更新功能时,它如何更新DLL而不影响当前运行的应用程序 由于应用程序在更新过程中运行,因此DLL不会被锁定(因为这些DLL将在更新过程中被覆盖)。通常您会将新文件下载到单独的区域。然后关闭并重新启动,然后在启动时查找并使用新文件(如果找到)。始终保留最后一个已知的工作版本,以便用户可以在下载导致问题时恢复到肯定有效的版本 ClickOnce是Microsoft为您提供的一项很好的技术,您可以直接从Visual Studio 2008使用它。如果您通过C

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


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

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


ClickOnce是Microsoft为您提供的一项很好的技术,您可以直接从Visual Studio 2008使用它。

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

两者都有关于使用ClickOnce、其工作原理等方面的详细信息

正如其他人所说,ClickOnce没有滚动您自己的解决方案那么灵活,但它要简单得多。起初,它的学习曲线很小,但由于几乎所有东西都捆绑到了VisualStudio中,并且使用了向导,所以通常不需要很长时间就能找到一个可行的解决方案

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


我试图避免使用自定义安装程序的唯一原因是,你最终花了太多时间试图让它正确处理一系列不同的“如果”情况…

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

其他的选择是使用ClickOnce,或者像其他人提到的那样,将文件下载到一个单独的区域并重新启动应用程序


不过,要注意ClickOnce,它不像听起来那么灵活。如果部署到需要将程序提升到更高安全级别才能运行的系统,如果没有安装应用程序的证书,则可能会遇到问题。我发现很难在互联网上直接找到关于ClickOnce的答案,比如证书管理。如果你有一个复杂的应用程序,你可能只想滚动你自己的更新程序,这就是我最后不得不做的。

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

我编写了一个开源代码,以透明模式实现这一点——包括一个外部更新应用程序来执行实际的冷更新。看


代码位于(根据Apache 2.0许可证获得许可)

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

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


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

您可以查看这两种方法,并决定哪种方法最适合您。ClickOnce只是开箱即用,但您对它的控制有限。使用Updater应用程序块需要更多的努力,但您可以进行更多的控制,因为您可以随时更改源代码。ClickOnce仅适用于用户(而不是机器范围)安装。一个更强大的解决方案是Google Omaha:。为什么要使用web服务检查更新?webclient更快不?@PeterMortensen 2008年提出的一个问题与2011年提出的问题有多像?特别是当这一条似乎包含更好的信息时