无法更新由MSI安装的Windows服务

时间:2018-08-30 08:53:54

标签: c# json.net windows-services windows-installer

我面临一个奇怪的问题,我找不到可行的解决方案。预先感谢您的帮助。

我用C#开发了Windows服务,该服务使用Newtonsoft.JSON库来解析一堆WebAPI的结果。该服务已与MSI一起部署,并且一切运行正常。

该服务的第一个版本使用的是Newtonsoft.JSON 6.0.8,但是最近我移到了11.0.2版。

我打包了一个新的MSI(具有正确的版本/产品ID /升级ID以确保升级),并且我正尝试通过执行以下操作的小型安装应用程序来部署新版本:

  1. 使用System.ServiceProcess.ServiceController停止服务(如果已安装并正在运行)
  2. 使用System.ServiceProcess.ServiceController
  3. 卸载服务
  4. 运行System.Process来在新的msi文件上调用msiexec

结果:该服务无法正常工作,从日志中,我可以看到该应用程序仍在寻找Newtonsoft.JSON的6.0.8版本。

如果我尝试以下操作:

  1. 右键单击msi->卸载
  2. 右键单击msi->安装

一切正常,服务使用该库的11.0.2版...

我为此感到疯狂...如何修复/清理升级过程?

预先感谢

1 个答案:

答案 0 :(得分:1)

  

摘要 :修改并扩展您的MSI以处理所有与服务相关的任务:service installationservice deletionservice control。使用内置的MSI构造即可。


服务安装 :不确定我是否遵循了整个问题方案的描述,但要解决的问题是您应该让MSI自己在安装过程中控制服务安装和服务控制安装和升级过程。服务通过ServiceInstallServiceControl表在MSI文件中安装和控制,这些表直接映射到WiX XML元素,如下所示:

<Component>
   <File Source="$(var.SourceDir)\WindowsService.exe" />
   <ServiceInstall Name="MyService" ErrorControl="normal" Start="auto" Type="ownProcess" />
   <ServiceControl Id="MyService" Name="MyService" Start="install" Stop="both" Remove="uninstall" Wait="yes" />
</Component>

Let me link to a similar sample on github(通过Rainer Stropek),如果以上内容不清楚的话。它更加完整和详尽。


链接 :此答案讨论了相同的问题:Service Installation & Control。认为使用custom actions或自定义可执行文件来处理服务控制以及安装或卸载是a deployment anti-pattern-既不必要,不理想也不可靠。一旦正确使用,MSI便具有功能齐全且可靠的功能(除非您拥有非常特殊且与众不同的服务,并且“出于某种原因”需要自定义操作)。