4

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

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

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

我试图在 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 的主机有关。此处的服务似乎也安装正确,但无法运行。

有没有人能够NServiceBus.Host.exe使用 WiX 安装为服务?或者有谁知道我运行时是否有其他步骤发生NServiceBus.Host.exe /install在我的 WiX 安装程序中?

CustomAction我知道我可以在运行的 WiX 中创建一个,NServiceBus.Host.exe /install但如果可能的话,我宁愿避免这种情况,并以正确的 (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>
4

2 回答 2

1

您不应尝试在 WiX 中复制 NServiceBus 主机安装程序。有很多事情会发生,这些事情会随着每个版本而改变,所以你尝试的任何东西都会非常脆弱。

您应该使用正确的命令行处理程序简单地执行主机,而不是 ServiceInstall 元素,并让 NServiceBus 自行处理。我对 WiX 不是很熟悉,但我认为有某种方法可以使用命令行参数执行任意可执行文件?

要清楚

是的,可以使用 WiX 将 NServiceBus 端点安装为服务。我是说你不应该,不是说你不能。

如果您不使用 NServiceBus 安装程序来安装端点,您将错过队列生成和 NServiceBus 主机调用的其他任务,而 WiX(不知道 NServiceBus 如何运行)无法执行。

于 2013-08-19T17:33:54.217 回答
1

您快到了。您需要将预期的命令行参数传递给标签上NServiceBus.Host.exeArguments属性, 例如ServiceInstall

<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配置文件来实现类似的效果,例如

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

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

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

于 2013-08-20T08:59:46.133 回答