WinForms应用程序的自动更新

20

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

由于应用程序在更新过程中正在运行,那么DLL会被锁定吗(因为这些DLL需要在更新期间被覆盖)?


5
@PeterMortensen:一个在2008年提出的问题,怎么可能成为2011年一个同样问题的重复?特别是这个看起来包含更好信息的。 - Kris
5个回答

17
通常情况下,您会将新文件下载到一个单独的区域。然后关闭并重新启动,在启动时查找并使用新文件(如果找到)。始终在一侧保留上一个已知工作版本,以便用户可以在下载导致问题时还原到肯定有效的内容。
ClickOnce是来自Microsoft的良好技术,可直接从Visual Studio 2008中使用此技术。

您可以查看两种方法,然后决定哪种对您更合适。ClickOnce开箱即用,但您对其拥有的控制权有限。使用Updater应用程序块需要更多的工作,但您可以随时修改源代码,因此拥有更多的控制权。 - Phil Wright
ClickOnce仅适用于用户(而非机器范围)安装。一个更强大的解决方案是Google Omaha:https://github.com/google/omaha。 - Michael Herrmann

7

5

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

其他替代方案包括使用 ClickOnce 或将文件下载到单独的区域并重新启动应用程序,正如其他人提到的那样。

请注意 ClickOnce - 它并不像听起来那么灵活。如果您部署到需要将您的程序提升到更高安全级别才能运行的系统上,并且没有为您的应用程序安装证书,则可能会遇到问题。当涉及到 ClickOnce 时,我很难在互联网上找到关于证书管理之类的明确答案。如果您的应用程序较为复杂,您可能需要自己开发更新程序,这就是我最终不得不做的。


为什么要使用 Web 服务来检查更新?WebClient 不是更快吗? - AnonymousCow

4
如果您通过ClickOnce发布,所有这些都往往由它自己处理。它有自己的优缺点,但通常比尝试自己编码要容易得多。 维基百科15秒都有关于如何使用ClickOnce以及它的工作原理等方面的良好信息。
正如其他人所说,ClickOnce不像自己开发解决方案那样灵活,但它要简单得多。一开始可能需要一些学习曲线,但几乎所有东西都打包在Visual Studio中并使用向导,通常不需要花费太长时间就能找到可行的解决方案。
随着部署变得更加复杂(即超出了仅具有先决条件或需要更新应用程序代码的范围),并且您需要执行大量的安装后或安装前任务时,像WiX这样的工具可以为您提供一种类似于Windows Installer和ClickOnce之间的混合解决方案,但代价是需要更陡峭的学习曲线。
我尽量避免自定义安装程序的唯一原因是,您最终会花费太多时间来尝试让它完美地处理各种不同的“假设”场景...

0

如今,如果您的应用程序封装在MSIX包中,Windows可以通过AppInstaller自动进行更新。

它会在ProgramFiles\WindowsApps文件夹内下载新版本的应用程序。当用户通过启动菜单运行应用程序时,系统会知道应该使用哪个文件夹。不使用的上一个版本将被删除。

如果您想了解如何以这种方式打包您的应用程序,我已经收集了这篇答案中的发现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接