自动更新WinForms应用程序

时间:2020-03-06 14:46:55  来源:igfitidea点击:

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

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

解决方案

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

ClickOnce是Microsoft的一项优秀技术,可以为我们执行此操作,我们可以直接在Visual Studio 2008中使用它。

如果我们是通过ClickOnce发布的,那么所有这些事情都将为我们处理。它具有自己的优点和缺点,但是通常比尝试自己编写全部内容容易。

Wikipedia和15seconds都具有有关使用ClickOnce,其工作方式等的不错信息。

正如其他人所说,ClickOnce不像滚动我们自己的解决方案那样灵活,但是它不那么复杂。一开始它的学习曲线很小,但是几乎所有内容都捆绑在Visual Studio中,并且使用了Wizards,因此花很短的时间就能找到一个可行的解决方案。

随着部署变得越来越复杂(即,不仅需要准备工作或者需要更新的应用程序代码),而且我们需要执行大量的安装后或者安装前任务,诸如WiX之类的东西在某种程度上为我们提供了一种混合解决方案, Windows Installer和ClickOnce,灵活性的代价使学习曲线更加陡峭。

我尝试避免使用自定义安装程序的唯一原因是,我们最终花费太多时间试图正确处理一系列不同的"假设"方案...

我有一个单独的"启动器"应用程序,可通过Web服务检查更新。如果有更新,它将下载它们,然后执行我的应用程序,该应用程序在单独的程序集中。

其他替代方法是使用ClickOnce之类的东西,或者将文件下载到单独的区域中,然后重新启动应用程序,如其他人所述。

请注意ClickOnce,尽管它听起来并不灵活。而且,如果我们部署到需要将程序提升到更高的安全级别才能运行的系统,则可能会遇到问题,如果我们没有为应用安装证书。对于ClickOnce,我发现很难在Internet上直接获得诸如证书管理之类的答案。如果我们有一个复杂的应用程序,则可能只想滚动我们自己的更新程序,这就是我最终要做的。

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

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

该代码位于http://github.com/synhershko/NAppUpdate(在Apache 2.0许可下获得许可)