2013-10-16 115 views
0

我是WiX的新手,並且正在嘗試創建一個安裝包含3個Windows服務的應用程序的安裝程序。其中一個服務在虛擬中提供了一個用於調試其他兩個服務的鉤子。我可以使用InstallUtil成功安裝服務,但需要包含其他組件和應用程序的更完整的安裝。使用WiX來安裝具有多個Windows服務的進程

在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> 

我發現,涉及到創建多個服務的各種問題,但我找不到任何問題,直接關係到這個場景或類似的足以推斷我做錯了什麼。

希望有人會有一個可能有所幫助的建議。

如果我錯過了某些明顯的東西,很樂意提供更多信息。

+0

我想你應該有一個組件和每個ServiceControl的文件,但你有三個同一個文件的ServiceControl。您是否嘗試爲每個服務創建一個組件和文件,併爲這些組件中的每一個分配一個ServiceControl? –

+0

您是否找到解決方案@ChandyHendrix? – Farinha

回答

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" /> 

更新的Program.cs您的Windows服務項目如下:

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); 
} 
+0

這真的是解決方案嗎?看起來有點遲緩的.Net有一種方法來Run()一個ServiceBase的數組,然後當需要運行多個時需要破解它。 此外,我發現使用'installutil'安裝Windows服務成功安裝了2個服務,觸發了2個「服務啓動」事件,並且從那裏一切正常運行。使用WiX是一件很糟糕的事情。 – Farinha

0

當您要安裝一個可執行多種服務,你需要將類型設置爲「sharedProcess」,否則只有一個服務將啓動,其他服務將不會啓動。