C#Windows服务的ClickOnce部署?

C#Windows服务的ClickOnce部署?,c#,windows-services,clickonce,C#,Windows Services,Clickonce,部署需要更新的Windows服务的最佳实践是什么 我将部署一个Windows服务,但在测试过程中可能需要一些调试和新版本。最好的处理方法是什么?理想情况下,我希望为Windows服务找到ClickOnce风格的部署解决方案,但据我所知,这并不存在。对于Windows服务,最接近ClickOnce的是什么?由于服务是长期运行的,使用ClickOnce样式的部署可能不可行,因为ClickOnce仅在启动应用程序时更新。服务通常仅在机器重新启动时启动 如果您需要自动更新服务,那么您的最佳选择可能是将代

部署需要更新的Windows服务的最佳实践是什么


我将部署一个Windows服务,但在测试过程中可能需要一些调试和新版本。最好的处理方法是什么?理想情况下,我希望为Windows服务找到ClickOnce风格的部署解决方案,但据我所知,这并不存在。对于Windows服务,最接近ClickOnce的是什么?

由于服务是长期运行的,使用ClickOnce样式的部署可能不可行,因为ClickOnce仅在启动应用程序时更新。服务通常仅在机器重新启动时启动

如果您需要自动更新服务,那么您的最佳选择可能是将代码输入到服务中,但我认为几乎任何解决方案都存在问题:大多数安装过程都需要某种程度的用户交互(如果只是为了绕过UAC),因此,我无法想象这将导致一个答案,不涉及让登录用户在某个时候出现在屏幕前

一个可行的想法是active directory部署(或类似的部署)。如果您的服务是通过标准MSI类型安装程序部署的,AD允许您作为计算机策略的一部分以静默方式更新应用程序。我怀疑您必须强制服务器刷新广告策略(通过从控制台重新启动或使用
gpupdate
),但除此之外,它应该是一种不需要动手的部署。

我建议在这方面使用“插件”方法,即使用


使用此模式时,独立线程可能会在文件夹上验证更新。您将需要在程序集部署中使用。当服务更新线程遇到服务的新版本时,它将卸载当前生产程序集并加载新版本,而不会停止服务本身。甚至更多!如果程序集中没有中断代码,您的服务永远不会注意到差异。

我建议创建一个正常的安装项目,并在该安装项目中添加windows服务项目输出


有关更多信息,请参阅。

我这里有一个我们在工作中使用的系统,它似乎与服务配合得很好。我们部署的系统在任何给定时间都有大约20-30个服务。在工作中,我们使用一种叫做TopShelf的产品,你可以在这里找到它

基本上,TopShelf处理很多和服务相关的东西。从服务的cmd行安装、卸载等。其中一个非常有用的特性是能够作为控制台运行以进行调试。您构建了一个服务,使用不同的cmd行start,您可以将其作为控制台运行,以查看服务的输出。我们在该软件中添加了一个自定义功能,允许我们提前配置配置文件。基本上,我们的配置文件配置了一些东西,比如日志记录、资源位置等,这样我们就可以控制所有这些,而无需重新发布任何代码。我们所做的就是运行一个命令,比如

D:\Services\ServiceName.exe Core.Profiles.Debug
D:\Services\ServiceName.exe Core.Profiles.Production

以获得不同的日志记录配置

我们的构建脚本为每个服务创建install.cmd和uninstall.cmd脚本我们所做的只是将文件复制到服务器并运行脚本。如果我们想看到调试输出,我们停止服务并双击exe,然后我们得到一个控制台来读取所有输出

topshelf还有一个我们不使用的东西,因为它没有必要,那就是搁置的概念(这个网站上有相关文档)。这允许您无需“重新启动”即可更新服务,但您仍然需要手动复制文件,除非为此构建自动化系统


但是,如果您需要100%的服务可用性,我的建议是使用冗余系统。无论您如何配置更新服务,如果没有自动故障切换系统,都无法避免硬件故障导致停机。如果所述系统就位,我建议的更新策略是关闭1个节点,更新、测试、打开关闭另一个节点,更新、测试并重新打开第二个节点。当然,您可以通过一个简单的脚本来完成这一切。这可能是一个比你需要的更复杂的系统,但是如果你不能让一个服务离线,只需要5秒钟的简单重启,那么你真的需要一些系统来处理硬件问题,因为我可以保证它最终会发生。

我使用的一个简单解决方案就是停止服务,然后从我的服务器上x-copy文件将bin文件夹放入服务文件夹中

停止服务然后复制文件的批处理文件应该很容易组合在一起

Net stop myService
xcopy \\myServerWithFiles\*.* c:\WhereverTheServiceFilesAre
net start myService

我喜欢这个,又快又简单!嘿,我喜欢这个。在调试时,我基本上用手做同样的事情。与此问题的答案类似:另请参见