20

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

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

4

5 回答 5

17

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

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

于 2008-09-26T12:52:36.083 回答
7

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

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

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

于 2010-08-24T22:49:24.737 回答
5

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

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

不过,请注意 ClickOnce - 它不像听起来那么灵活。如果您部署到需要将程序提升到更高安全级别才能运行的系统,如果您没有安装应用程序的证书,您可能会遇到问题。当谈到 ClickOnce 时,我发现很难在 Internet 上获得证书管理等问题的直接答案。如果您有一个复杂的应用程序,您可能只想推出自己的更新程序,这就是我最终不得不做的事情。

于 2008-09-26T12:57:51.123 回答
4

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

Wikipedia和15seconds都提供了有关使用 ClickOnce、其工作原理等方面的不错信息

正如其他人所说,ClickOnce 不像滚动您自己的解决方案那样灵活,但它没有那么复杂。一开始它有一个小的学习曲线,但是几乎所有东西都捆绑到 Visual Studio 和向导的使用中,通常很快就会发现一个有效的解决方案。

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

我试图避免使用自定义安装程序的唯一原因是,您最终会花费太多时间试图让它恰到好处地处理一堆不同的“假设”场景......

于 2008-09-26T12:55:00.523 回答
0

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

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

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

于 2021-05-21T14:34:31.590 回答