我希望我的 C# Windows 服务自动更新

Posted

技术标签:

【中文标题】我希望我的 C# Windows 服务自动更新【英文标题】:I want my C# Windows Service to automatically update itself 【发布时间】:2010-09-11 12:41:49 【问题描述】:

是否有可用于使 C# Windows 服务自动检查更新版本并自行升级的框架?我当然可以编写代码来实现这一点,但我正在寻找一个已经实现并(最重要的是)经过测试的框架。

[编辑] 这是一个类似问题的链接,其中包含有助于实现此目的的现代项目的链接:Auto-update library for .NET?

【问题讨论】:

我刚刚发现了一篇博文“在 .NET/C# 中创建自动更新应用程序”(nerdparadise.com/tech/csharp/autoupdatingapp),其中包含代码链接。它适用于应用程序,而不是服务,但我敢打赌它可以很容易地更新以工作。 【参考方案1】:

卸载类型的唯一方法是销毁 appdomain。要做到这一点,需要将您的托管层与您执行的服务代码分开——这非常复杂。 (有点像做锁孔手术)

a) 运行批处理任务或 b) 在服务中检测更新然后启动单独的进程来停止服务、更新程序集等然后重新启动它可能更容易。

如果您对前者感兴趣,MSDN 模式和实践人员编写了一个应用更新程序块,您可以根据自己的服务进行调整。

https://web.archive.org/web/20080506103749/http://msdn.microsoft.com/en-us/library/ms978574.aspx

【讨论】:

我很惊讶,就像今天一样,3 年后没有简单的解决方案。谢谢stepbu。 卸载类型非常困难。这将涉及展开内存中该类型的所有实例,以及对该实例的任何引用,例如其他实例中的成员和属性。可能是非常不可预测的中等复杂应用程序的副作用。卸载应用程序域解决方案通过使该应用程序域中的所有内存无效来回避该问题。让您只处理一个(尽管更大,但具有确定性)问题。 我知道这是一个老问题,但我还想补充一点,目前拥有足够资源以“正确方式”做事的公司(如 Adob​​e 和 Google)也确定了单独服务仅用于检查更新模式。他们可能没有使用 C#,并且他们的项目可能与您的项目不相似,但我认为承认这是一个具有真正好处的真正解决方案,而不仅仅是一个现在足够好的黑客,这至少是有用的。 我几乎不会将 Adob​​e 或 Google 的更新方法称为权利堡垒。最常见的是,它们在家庭环境中的快速切换/多用户登录中失败。一些失败示例: 为每个用户安装一项服务。循环吸壳扩展。在任务计划程序中为每个用户安装任务。这些都不是很好的行为。恕我直言,一个更好的例子是 Spotify 背景检查和 UI 可选的“重新启动以更新”方法。 服务故事在重新启动时安装 - 强制(由应用程序)或在下次重新启动时安装。选择你的毒药。【参考方案2】:

我在 Google Omaha 更新 Windows 服务方面有很好的经验。它通常可用于更新任何 Windows 应用程序,但有一个 tutorial 用于使用它来更新 Windows 服务。

与其他更新框架相比,Omaha 更复杂,但也是最强大的。这是因为谷歌(现在还有微软)使用它来更新数十亿台 PC 上的浏览​​器。但是,一旦设置好并且您了解了基础知识,这将是一次非常好的体验。

【讨论】:

【参考方案3】:

我不知道有任何框架有助于解决这个特定问题。

您可以尝试将服务的业务逻辑与实际服务代码分离到不同的程序集中。让服务程序集定期检查业务逻辑程序集的更新,如有必要,从远程源复制它,卸载旧的 BL 程序集(也可能删除),然后动态加载新版本(卸载旧程序集不是一个微不足道的任务)。

【讨论】:

【参考方案4】:

另一种可能的解决方案是让一个单独的服务运行,如果有更新,则停止另一个服务,然后更新该服务。您无法自行更新服务,因为正在运行的 .dll 不会停止。

分离业务逻辑层将是一个不错的选择。您还可以重写主服务以在主服务或控制服务的反射下运行。这类似于分离业务逻辑,只需要停止一个线程并重新启动它。

我知道没有已知的框架可以做到这一点。我自己做了这个,但这不是一个公共框架。

【讨论】:

这正是 Google Omaha 所做的。它作为单独的服务运行并“从外部”更新其他应用程序。见omaha-consulting.com/…。【参考方案5】:

我一直在使用 WyBuild 来更新我的应用程序(包括 Windows 服务),它非常棒。非常易于使用,并且非常易于与现有应用程序集成。这是一个非常棒的自动更新框架...

http://wyday.com/wybuild/help/automatic-updates/windows-services-console-apps.php http://wyday.com/wybuild/help/silent-update-windows-service.php

请注意,它是一个付费框架(许可证是每个开发者,包括免费试用)

【讨论】:

您是否与相关产品有关联? 不,我只是一个普通用户......(抱歉回复晚了!)【参考方案6】:

如果其他人正在搜索此内容;我发现这个链接很有趣。我还没有实现这个解决方案,但它看起来可能对我有用

http://www.eggheadcafe.com/articles/20041204.asp

【讨论】:

【参考方案7】:

您可以使用NetSparke,它支持.NET Core 3+ (.NET 5+) 和.NET Framework 4.5.2+。它带有内置的 UI 或根本没有任何 UI。您可以自己处理所有事件。它与 appcast.xml 一起工作(并且还有一个生成它的实用程序),独立于平台并且开箱即用。

只需通过他们存储库上的文档工作并检查示例应用程序;-)

【讨论】:

【参考方案8】:

你能澄清一下你的问题吗?我有点困惑,因为据我所知, 您始终可以覆盖服务使用的 DLL。服务的复制和重新启动可以轻松地成为您构建过程的一部分。

【讨论】:

很抱歉给您带来了困惑。我想要一种方法让我的服务轮询更新并在找到时自行安装它们。我在许多生产(访问控制)服务器上都有许多服务,并且非常厌倦手动干预的麻烦和风险。

以上是关于我希望我的 C# Windows 服务自动更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c# mvc 中自动刷新 jqgrid

C#实现开发windows服务实现自动从FTP服务器下载文件(自行设置分/时执行)

windows10系统关闭自动更新服务

使用ajax c#自动刷新带有更新数据的Gridview?

使用PowerShell关闭Windows更新服务和自动更新Windows 10

c#写的winform设置了启动检查更新,又设置了开机自动启动,开机自启动时不能启动更新程序