是否有可用于使C#Windows服务自动检查更新版本并自行升级的框架?我当然可以编写代码来实现这一目标,但我正在寻找一个已经实现并且(最重要的)测试过的框架。
[编辑] 这是一个类似问题的链接,其中包含指向现代项目的链接,有助于实现此目的:Auto-update library for .NET?
答案 0 :(得分:16)
卸载类型的唯一方法是销毁appdomain。要做到这一点,需要将托管层与执行的服务代码分开 - 这非常复杂。 (有点像做锁孔手术)
可能更容易a)运行批处理任务或b)服务中检测更新然后启动一个单独的进程来停止服务,更新程序集等然后重新启动它。
如果您对前者感兴趣,那么MSDN模式和实践民众会编写一个适应您服务的应用更新程序块。
https://web.archive.org/web/20080506103749/http://msdn.microsoft.com/en-us/library/ms978574.aspx
答案 1 :(得分:4)
我在 Google Omaha 更新 Windows 服务方面有很好的经验。它通常可用于更新任何 Windows 应用程序,但有一个 tutorial 可用于使用它来更新 Windows 服务。
与其他更新框架相比,Omaha 更复杂,但也是最强大的。这是因为谷歌(现在还有微软)使用它来更新数十亿台 PC 上的浏览器。但是,一旦设置好并且您了解了基础知识,那将是一次非常好的体验。
答案 2 :(得分:3)
我不知道有任何框架可以解决这个特定问题。
您可以尝试将服务的业务逻辑与实际服务代码分离到不同的程序集中。让服务程序集定期检查业务逻辑程序集的更新,必要时从远程源复制它,卸载旧的BL程序集(也许删除),然后动态加载新版本(卸载旧程序集不是一项微不足道的任务)。
答案 3 :(得分:2)
另一种可能的解决方案是运行单独的服务,如果有更新则停止另一个服务,然后更新服务。您无法自行更新服务,因为正在运行的.dll不会停止。
分离业务逻辑层将是一个不错的选择。您还可以重写主服务以在主服务器或控制服务的反射下运行。这类似于分离业务逻辑,它只需要停止一个线程并再次启动它。
我知道没有已知的框架可以做到这一点。我自己做了这个,但这不是一个公共框架。
答案 4 :(得分:2)
我一直在使用WyBuild来更新我的应用程序(包括Windows服务),这非常棒。非常易于使用,并且非常容易与现有应用程序集成。这是一个非常棒的自动更新框架......
http://wyday.com/wybuild/help/automatic-updates/windows-services-console-apps.php http://wyday.com/wybuild/help/silent-update-windows-service.php
请注意,它是一个付费框架(许可证是每个开发人员,包含免费试用版)
答案 5 :(得分:1)
如果其他人正在搜索此内容;我觉得这个链接很有趣。我没有实现这个解决方案,但看起来它可能对我有用
答案 6 :(得分:-1)
你能澄清一下你的问题吗?我有点困惑,因为据我所知, 您始终可以覆盖服务使用的DLL。可以轻松地将服务的复制和重新启动作为构建过程的一部分。