使用WiX将NServiceBus.Host安装为服务

我正在使用WiX为我们基于NServiceBus的解决方案创建一个安装程序,但是我在安装后无法启动主机服务.

如果我使用NServiceBus.Host.exe / install从命令行运行主机的安装程序,它安装正常,甚至在我启动服务时成功启动.

但是,当我使用ServiceInstall元素在WiX中创建服务时,它无法启动该服务.我尝试使用ServiceControl元素在我的安装程序中启动该服务,以及从WIndows Services控制面板进行安装后.

我试图在WiX中使用的代码是:

<Component Id="NServiceBus.Host" Guid="PUT-GUID-HERE" Win64="yes">
  <File Id="NServiceBus.Host" KeyPath="yes"
      Source="$(var.[Project].TargetDir)NServiceBus.Host.exe" Checksum="yes" />
  <ServiceInstall Id="NServiceBus.Host.Install"
      Name="[Product].Host" DisplayName="[Product]" Type="ownProcess"
      Account="NT Authority\Network Service" Interactive="no" Start="auto"
      Vital="yes" ErrorControl="normal">
    <ServiceDependency Id="MSMQ" />
    <ServiceDependency Id="MSDTC" />
  </ServiceInstall>
  <ServiceControl Id="NServiceBus.Host.Control" Name="[Product].Host"
      Start="install" Stop="both" Remove="uninstall" Wait="yes" />
</Component>

我在其他项目中使用了相同的代码来安装和运行服务,所以我很确定这个问题与NServiceBus的主机有关.此处的服务似乎也正确安装但无法运行.

有没有人能够使用WiX安装NServiceBus.Host.exe作为服务?或者有人知道当我运行我应该在我的WiX安装程序中复制的NServiceBus.Host.exe / install时是否还有其他步骤?

我知道我可以在运行NServiceBus.Host.exe / install的WiX中创建一个CustomAction,但是如果可能的话我宁愿避免这种情况,并以正确的(WiX)方式安装服务.它还避免了我需要考虑卸载操作和排序.

编辑:作为参考,这是我使用WiX的MsmqExtension创建队列的方式:

<Component Id="NServiceBus.Host.Queue" Guid="PUT-GUID-HERE" Win64="yes">
  <msmq:MessageQueue Id="Queue1" Label="[Product] Host"
      PathName=".\private$\[Product].Host"
      Transactional="yes" PrivLevel="optional" />
  <msmq:MessageQueue Id="Queue2" Label="[Product] Host Retries"
      PathName=".\private$\[Product].Host.Retries"
      Transactional="yes" PrivLevel="optional" />
  <msmq:MessageQueue Id="Queue3" Label="[Product] Host Timeouts"
      PathName=".\private$\[Product].Host.Timeouts"
      Transactional="yes" PrivLevel="optional" />
  <msmq:MessageQueue Id="Queue4" Label="[Product] Host Timeouts Dispatcher" 
      PathName=".\private$\[Product].Host.TimeoutsDispatcher"
      Transactional="yes" PrivLevel="optional" />
</Component>

最佳答案 你快到了.您需要将NServiceBus.Host.exe期望的命令行参数传递给ServiceInstall标记上的Arguments属性,如

<ServiceInstall Id="NServiceBus.Host.Install"
     Name="[Product].Host" DisplayName="[Product]" Type="ownProcess"
     Account="NT Authority\Network Service" Interactive="no" Start="auto"
     Vital="yes" ErrorControl="normal"
     Arguments="-service NServiceBus.Production /serviceName:[Product].Host">

首先使用NSB主机安装服务,然后查看Windows服务和安装中的所有命令行参数.将它们放入您的WiX安装程序.

编辑:
如果您不想运行自定义操作以使NSB在WiX @安装时创建队列和/或执行其他操作,则可以通过在代码中添加自定义NSB profile来实现类似的效果,例如

namespace YourNamespace
{
    public class YourProfile : NServiceBus.IProfile { }

    public class YourProfileBehaviour : IHandleProfile<YourProfile>
    {    
        public void ProfileActivated()
        {
            WindowsInstallerRunner.RunInstallers = true;
        }
    }
}

请记住,使用上面的配置文件将在每次重新启动服务时运行NSB安装程序代码(例如,在必要时检查并添加队列).我想两种方式都有权衡.

点赞