为.NET WinForms应用程序创建自动更新功能时,它如何更新DLL而不影响当前运行的应用程序?
由于应用程序在更新过程中运行,因此不会对DLL进行锁定(因为在更新期间必须覆盖这些DLL)。
答案 0 :(得分:17)
通常您会将新文件下载到单独的区域。然后关闭并重新启动,并在启动时查找并使用新文件(如果找到)。始终保持最后一个已知的工作版本,以便用户可以恢复到下载导致问题时肯定有用的东西。
ClickOnce是Microsoft提供的一项优秀技术,您可以直接在Visual Studio 2008中使用它。
答案 1 :(得分:7)
您必须关闭应用程序并重新启动它,就像其他人已经评论过一样。
我编写了一个开源代码,以透明模式执行此操作 - 包括执行实际冷更新的外部更新应用程序。见http://www.code972.com/blog/2010/08/nappupdate-application-auto-update-framework-for-dotnet/
代码位于http://github.com/synhershko/NAppUpdate(根据Apache 2.0许可证授权)
答案 2 :(得分:5)
我有一个单独的'启动器'应用程序,它通过Web服务检查更新。如果有更新,它会下载它们然后执行我的应用程序,这是一个单独的程序集。
其他替代方案正在使用像ClickOnce这样的东西,或者将文件下载到单独的区域并重新启动应用程序,就像其他人提到的那样。
不过会对ClickOnce发出警告 - 它并不像听起来那么灵活。如果您部署到需要将程序提升到更高安全级别才能运行的系统,则如果您没有安装应用程序的证书,则可能会遇到问题。我发现在ClickOnce上很难在互联网上获得证书管理等问题。如果您有一个复杂的应用程序,您可能只想滚动自己的更新程序,这是我最终必须做的。
答案 3 :(得分:4)
如果您通过ClickOnce发布,则所有这些都会为您处理。它拥有自己的专业版和骗子版,但通常比尝试自己编写代码更容易。
Wikipedia和15seconds都有关于使用ClickOnce,工作原理等方面的正确信息。
正如其他人所说,ClickOnce并不像滚动自己的解决方案那样灵活,但它不那么复杂。它起初只有一个小的学习曲线,但几乎所有内容都捆绑在Visual Studio和Wizards的使用中,通常不会花费很长时间才能找到可行的解决方案。
随着部署变得更加复杂(例如,不仅仅是需要更新的先决条件或应用程序代码)而且您需要执行大量的安装后或预安装任务,有些事情如WiX可以为您提供一些帮助Windows Installer和ClickOnce之间的混合解决方案,灵活性成本是一个更陡峭的学习曲线。
我试图避免使用自定义安装程序的唯一原因是你最终花费了太多时间试图让它恰到好处来处理一堆不同的“假设”场景... < / p>
答案 4 :(得分:0)
现在,如果您的应用程序打包在 MSIX 程序包中,Windows 可以使用 AppInstaller 自动为您执行此类更新。
它将应用程序的新版本下载到 ProgramFiles\WindowsApps
内的另一个文件夹中,然后当用户通过开始菜单运行应用程序时,系统知道它应该使用哪个文件夹。不使用时删除以前的版本。
如果您想知道如何以这种方式打包您的应用,我在 this answer 中收集了我的发现。