什么是在生产环境中更新.NET Windows服务的最简单方法?

8
假设你在服务器上安装了一个自定义的Windows服务。该服务使用.NET编写,并使用InstallUtil、MSI包或ManagedInstallerClass进行安装(如果有区别,请选择解决问题的方法)。通常,您需要部署服务的更改,并且当然希望尽可能简单易行。
只停止服务,替换.exe文件并重新启动服务是否“安全”?或者您是否需要使用新的.exe文件卸载和重新安装?如果将服务中的“演化”部分拆分为单独的程序集,是否更容易?是否有任何工具或API可以在开发或部署服务方面提供帮助?
3个回答

12

我只需停止服务并更换可执行文件;这样做是安全的。

您可以让服务开始加载模块,然后以这种方式开发系统;这会起作用,但具体取决于您想要做什么,可能过于复杂或不够复杂。


这是最简单的,安装Util注册后,除了重新复制文件之外,无需做任何其他操作。 - Pat
3
除非服务安装程序中的一些相关设置被更改(例如用户帐户等),否则它可以很好地运行。当然,该服务可能仍会运行,但是使用的设置与预期的设置不同。 - Dirk Vollmar
divo:你说得对,我忘了提到这一点。值得注意的是,在实践中,这些类型的事情很少在应用程序版本之间发生变化。 - Noon Silk

5
只需停止服务,替换EXE文件,然后重新启动服务。这应该是安装程序的一部分。将其拆分为不同的程序集仅为了重新安装而做是不必要的。

2

在更新服务时,我们要么使用MSI包(如果我们已经向客户提供了安装程序),要么使用一个简短的脚本来处理停止和卸载旧版本服务,然后复制、安装和启动新版本。

对于部署本地服务的脚本编写,您可以使用标准的Windows命令,例如net startnet stopinstallutil结合使用;对于远程部署,您可以使用SysInternals中的psexecutepsservice等工具。


你选择卸载并重新安装的特殊原因是什么?这是为了防备“服务安装程序中的设置”可能发生的更改吗?(参见您对silky答案的评论) - Jørn Schou-Rode
是的,这只是一种更干净的方式,例如在服务名称已更改的情况下。如果不进行卸载/重新安装,则可能会在注册表中获得旧条目。 - Dirk Vollmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接