自动更新.NET应用程序

31

我们正在开发一个非常复杂的系统,由多个WCF服务、ASP.NET MVC应用程序、管理工具(Windows Forms应用程序)组成...其中一些将在多台服务器上运行。我们正在寻找一个适用于这样一个系统的好的自动更新解决方案。很可能,我们需要一个单独的自动更新应用程序(服务)来完成这项工作,或者一些集中式的管理应用程序,它将了解所有已安装实例的版本并远程进行更新。您是否知道或有经验的任何为此目的而制作的好的产品/库?


1
自动更新适用于WCF服务和ASP.NET MVC应用程序吗?这是否合适?自动更新(如点击一次)适用于客户端应用程序,而不是基于服务器的服务! - Mitch Wheat
6
“是否合适”这一点存在争议-如果将“自动更新”改为“智能部署”,从理论上讲,它确实有意义,尤其是在将系统的任何元素部署到多个服务时。但挑战在于您可能需要处理更加复杂的安装方案以及安全/权限问题。 - Murph
一个独立的自动更新后台服务的最佳解决方案是 Google Omaha。它是 Chrome 使用的工具。关于 Omaha 的介绍,请参阅 https://omaha-consulting.com/google-omaha-tutorial。 - Michael Herrmann
5个回答

46

对于任何类型的自动更新,我个人使用非常简单的方法:

  • 拥有一个安装程序
  • 检查新版本(使用简单的WebClient并将版本号与当前的AssemblyVersion进行比较)
  • 如果版本较高,则下载最新的安装程序(出于安全考虑,应该使用SSL)
  • 运行已下载的安装程序并关闭应用程序。(在此阶段,如果您的安装程序需要管理员权限,则需要拥有管理员权限)

安装程序会处理剩下的事情。这样,您始终拥有最新版本和最新版本的安装程序。


我会选择这种方法,简单而有效,而不是添加第三方项目,难以维护。 - Ahmed
而且,在后台完成所有这些工作将是锦上添花! - Shahid M Zubair
我也这样做,效果非常好,因为我可以信任我的安装程序执行完整和完全的升级,而不是一些补丁过程。 - DaveO
4
有没有不使用安装程序的方法来完成这个操作? - Momoro
1
@Momoro 你可以看一下MSIX技术 - https://www.meziantou.net/deploying-a-dotnet-desktop-application-using-msix.htm#creating-the-msix-pa-3a8341。使用它,你不必考虑安装、后台更新等问题。它比ClickOnce好得多,命令行使用非常方便,更新不会打扰用户,也可以用于后台应用程序。 - Lev
@Lev 抱歉回复晚了。我一定会去了解 MSIX 技术的!谢谢! - Momoro

28

首先,我是一家公司的创始人,我们提供完整的更新解决方案,包括:

wyUpdate处理所有Vista/Windows 7 UAC问题,以及在尝试更新复杂软件时不可避免出现的所有文件权限问题。

我们还为开源项目提供免费的wyBuild许可证,但如果您只想构建自己的更新器,可以自由使用我们的源代码。

话虽如此,如果您想构建自己的更新器,以下是一些提示:

构建自己的更新器

一个好的起点是上面提到的wyUpdateAutomaticUpdater源代码。您可以将其拆分并用于自己的目的。它包含的一些算法:

  • 完全支持Windows Vista / Windows 7的UAC
  • 有限用户可以检查并更新(如果他们有凭据)
  • 支持奇怪的企业互联网。(如果您曾经与公司合作,这是一个真正的问题)。
  • 快速提取、打补丁和安装文件。
  • 注册表支持。
  • 在用户错误或取消时回滚文件和注册表
  • 自我更新(没有留下任何文件)

我们还在这里文件规格

自动更新

由于自动化是一个要求,请允许我告诉您我们如何使用我们的AutomaticUpdater控件来实现它。

我们使用命名管道在独立的updater(wyUpdate)和位于程序窗体上的自动更新控件之间通信。wyUpdate向自动更新器报告进度,自动更新器可以告诉wyUpdate取消进度、开始下载、开始提取等等。

这使得更新程序与您的应用程序分离。

实际上,我们使用的确切命名管道C#代码包含在我写的一篇文章中:Multi-process C# app like Google Chrome


通过“支持不稳定的企业互联网”,您是指绕过代理问题吗? - Shahid M Zubair
2
是的,它可以绕过一些代理问题。例如,有些客户端可能会配置错误的代理,但是如果不使用代理访问文件,则可以正常工作。因此,wyUpdate首先尝试使用任何代理,如果失败,则通过故意避免代理服务器再次尝试。最坏的情况是,在代理配置错误且无法直接访问互联网/内部网络的情况下,wyUpdate需要多花费1或2秒钟的时间。 - Wyatt O'Day

6
这是我为解决WinForms和WPF应用程序的特定需求编写的开源解决方案。 总体思路是在尽可能低的开销下拥有最大的灵活性。
因此,集成非常容易,并且库几乎为您完成所有操作,包括同步操作。 它还非常灵活,让您确定要执行的任务以及在什么条件下执行-您制定规则(或使用已经存在的规则)。 最后但并非最不重要的是支持任何更新源(Web,BitTorrent等)和任何提要格式-您可以自己编写未实现的内容。
还支持冷升级(需要应用程序重新启动),除非任务指定了“热交换”,否则会自动完成。
这归结为一个DLL,大小不到70kb。
更多细节请参见http://www.code972.com/blog/2010/08/nappupdate-application-auto-update-framework-for-dotnet/

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

当我有更多时间时,我计划进一步扩展它,但是老实说,您应该能够快速增强它,使其支持当前不支持的任何内容。

使用文件的“热交换”和“iisreset”任务,也应该可以使用它自动更新WCF服务和ASP.NET网站。


2
我们调查了几个选项,决定在我们的企业项目中使用AppLife Update库。
AppLife Update可以快速轻松地为您的.NET应用程序添加自动更新功能,但由于其全面的API,它也非常灵活。
请访问他们的网站查看完整的功能列表和一些演示视频。

虽然它不是免费的,但我必须说它看起来非常惊人。它看起来非常完整,而且从我尝试过的情况来看,它真的很容易使用。我猜如果你有一些时间花在更新过程上,你可能会编写自己的程序,但要达到这种结果,需要一段时间。 - SRKX

1
对于简单的WPF应用程序,那些可能使用Xcopy安装的应用程序,您可以使用this AppUpdater module。这是一个源模块,只需添加几行代码即可为简单的WPF应用程序添加更新功能。
它是免费的。

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