0

我是 WiX 的新手,我正在尝试创建一个安装程序来安装一个包含 3 个 Windows 服务的应用程序。这些服务中的一个提供了一个用于调试其他两个的钩子。我可以使用 InstallUtil 成功安装服务,但需要更完整的安装,包括其他组件和应用程序。

在 WXS 文件中,组件中有三个 ServiceInstall 节点和三个 ServiceControl 节点。这些节点指的是应用程序可执行文件中定义的三个服务的名称。

运行安装程序成功完成,服务报告为已安装并启动。但是,第二个和第三个服务的功能不可用,检查事件日志会发现虚拟服务的启动消息被输入了 3 次。停止所有 3 项服务时类似 - 虚拟关闭消息出现 3 次。WSX 文件中的服务声明与服务的实际安装方式之间似乎存在一些细分。

WSX 文件中与此组件相关的 XML 如下:

<Component Id="LPMMANAGEMENTSERVICE.EXE" 
    Guid="36C773C5-EF30-4D8D-B9CC-015EBE906CCB" DiskId="1">
        <File Id="LPMMANAGEMENTSERVICE.EXE" Name="LPMManagementService.exe" Source="Projects\LumePress\LumeJetManagement\LPMManagementService\bin\Release\LPMManagementService.exe" />
            <ServiceInstall Name="LPMManagementDebug" Type="ownProcess" Start="auto" 
                            ErrorControl="critical" Interactive="no" Account="LocalSystem" 
                            Vital="yes" DisplayName="LPM Management Service Debugger" 
                            Description="This service provides a process startup without starting the key services, allowing a debugger to attached and handle onstart and onstop" 
                            Id="LPM_Management_Service_Debugger_Installer" />
            <ServiceInstall Name="LPMServiceListeners" Type="ownProcess" Start="auto" 
                            ErrorControl="critical" Account="LocalSystem" DisplayName="LPM Management Service Listeners" 
                            Id="LPM_MANAGEMENT_SERVICE_LISTENERS_INSTALL" Interactive="no" Vital="yes" 
                            Description="Provides WebAPI and WCF Services for the LPM Architecture" />
            <ServiceInstall Name="LPMMonitoring" Type="ownProcess" Start="auto" ErrorControl="critical" 
                            Description="Manages and logs events from the LPM Core perl executable" 
                            DisplayName="LPM Management Service LPM Core and Monitoring" Account="LocalSystem" 
                            Id="LPM_MANAGEMENT_SERVICE_CORE_INSTALL" Interactive="no" Vital="yes">
                <ServiceDependency Id="LPMServiceListeners" />
            </ServiceInstall>
            <ServiceControl Id="LPM_MANAGEMENT_DEBUG_CONTROL" Name="LPMManagementDebug" 
                            Remove="uninstall" Start="install" Stop="both" />
            <ServiceControl Id="LPM_MANAGEMENT_SERVICE_LISTENERS_CONTROL" Name="LPMServiceListeners" 
                            Remove="uninstall" Start="install" Stop="both" />
            <ServiceControl Id="LPM_MANAGEMENT_SERVICE_CORE_CONTROL" Name="LPMMonitoring" 
                            Remove="uninstall" Start="install" Stop="both" />
        </Component>

我发现了与创建多个服务相关的各种问题,但我找不到与此场景直接相关或足以推断我做错了什么的问题。

希望有人会提出可能会有所帮助的建议。

如果我错过了一些明显的东西,很高兴提供更多信息。

4

2 回答 2

1

当您从单个可执行文件安装多个服务时,您需要将类型设置为“sharedProcess”,否则只有一个服务会启动而其他服务不会启动。

于 2016-02-22T11:10:49.847 回答
0

解决方案:将参数传递给可执行文件并根据此参数决定要实例化哪个服务。通过 ServiceInstall 标记将参数传递给您的 WindowsService 可执行文件,如下所示:

<ServiceInstall Name="LPMManagementDebug" Type="ownProcess" Start="auto" 
    ErrorControl="critical" Interactive="no" Account="LocalSystem" 
    Vital="yes" DisplayName="LPM Management Service Debugger" 
    Description="This service provides a process startup without starting the key services, allowing a debugger to attached and handle onstart and onstop" 
    Id="LPM_Management_Service_Debugger_Installer"
     Arguments  = "MyService1" />
<ServiceInstall Name="LPMServiceListeners" Type="ownProcess" Start="auto" 
    ErrorControl="critical" Account="LocalSystem" DisplayName="LPM Management Service Listeners" 
    Id="LPM_MANAGEMENT_SERVICE_LISTENERS_INSTALL" Interactive="no" Vital="yes" 
    Description="Provides WebAPI and WCF Services for the LPM Architecture"
    Arguments   = "MyService2" />

更新您的 windows 服务项目的 Program.cs,如下所示:

static void Main(string[] args)
{
    ServiceBase[] ServicesToRun;

    if (args != null && args.Length > 0)
    {
        switch (args[0])
        {
            case "MyService2":
                ServicesToRun = new ServiceBase[] 
                { 
                    new MyService2()
                };
                break;
            case "MyService1":
            default:
                ServicesToRun = new ServiceBase[] 
                    { 
                        new MyService1(),
                    };
                break;
        }
    }
    ServiceBase.Run(ServicesToRun);
}
于 2013-10-17T12:51:00.787 回答