【问题标题】:Cannot update a Windows Service installed by MSI无法更新 MSI 安装的 Windows 服务
【发布时间】:2018-08-30 08:53:53
【问题描述】:

我遇到了一个奇怪的问题,我找不到可行的解决方案。提前感谢您的帮助。

我用 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. 运行System.Process,在新的 msi 文件上调用 msiexec

结果:服务不工作,从日志中可以看出,应用还在寻找6.0.8版本的Newtonsoft.JSON。

如果我尝试以下操作:

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

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

我快要疯了...如何修复/清理升级过程?

提前致谢

【问题讨论】:

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


    【解决方案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 (by Rainer Stropek) 如果上述内容不清楚。它更加完整和详尽。


    链接:这个答案讨论了同样的问题:Service Installation & Control。使用custom actions 或自定义可执行文件来处理服务控制和安装或卸载被认为是a deployment anti-pattern - 这既没有必要,也不可取,也不可靠。一旦使用正确,MSI 功能齐全且可靠(除非您有一项非常特殊和不寻常的服务需要自定义操作“出于某种原因”。更正,新的更正如下:“对于一些非常充分的理由”)。

    【讨论】:

    • 实际上我正在使用 VS 生成 MSI(老实说,它总是有效)......你认为我必须搬到 Wix 吗?
    • VS 安装程序项目因其怪癖和限制而颇具传奇色彩 - 其中一些非常严重。这些项目往往会工作一段时间,直到突然出现几乎不可能处理的新的和不可避免的需求。迁移到 WiX 可能是一个更安全的选择——这完全取决于你的情况——尤其是你自己对应用程序的控制——或缺乏控制。如果您已经具备一些 WiX 知识,您可以随时使用 dark.exe MSI 反编译器将任何 MSI 反编译为 WiX 标记。反编译将始终需要大量按摩才能作为 WiX 源工作。
    • 我在过去的几个项目中使用过 Wix...我也将尝试在这种情况下将 VS 项目转换为 Wix...
    • 反编译后,请记住一定要取出服务自定义动作,替换成上面的ServiceInstall和ServiceControl构造。祝你好运。它可能很繁琐,但使用 WiX,您可以对未来进行精细控制。
    • 我从头开始编写了 Wix 项目(只是为了确保得到一个干净的结果),但实际上我在服务启动时出现权限错误...
    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 2011-10-15
    • 2012-12-01
    相关资源
    最近更新 更多