Wix - Как установить несколько служб Windows с одним исполняемым файлом? - PullRequest
2 голосов
/ 02 февраля 2012

Я пытаюсь установить несколько служб Windows с одним и тем же исполняемым файлом, но WiX не нравится одинаковые атрибуты имени в двух тегах файла. Я попытался изменить имена двух файловых тегов. Это работает, но я надеюсь, что мне не нужно устанавливать два одинаковых исполняемых файла только для этой цели. Есть лучший способ сделать это? Вот мой код:

<Component Id="Service1" Guid="{SOMEGUID1}">
  <File Id='Service1' Name='ConnDriver.exe' DiskId='1' Source='..\Service\obj\x86\$(var.BUILD)\ConnDriver.exe'  KeyPath='yes'/>
    <ServiceInstall
      Id="ServiceInstaller1"
      Type="ownProcess"
      Name="MyService1"
      DisplayName="MyService1"
      Description="Some Description"
      Start="auto" 
      Account="[SERVICEACCOUNT]"
      Password="[SERVICEPASSWORD]"
      ErrorControl="normal"
      Arguments=' "Service1"'
      Vital="yes"
      Interactive="no" />
    <ServiceControl Id="ServiceControl1" Stop="uninstall" Remove="uninstall" Name="MyService1" Wait="yes" />
</Component>

<Component Id="Service2" Guid="{SOMEGUID2}">
  <File Id='Service2' Name='ConnDriver.exe' DiskId='1' Source='..\Service\obj\x86\$(var.BUILD)\ConnDriver.exe'  KeyPath='yes'/>
    <ServiceInstall
      Id="ServiceInstaller2"
      Type="ownProcess"
      Name="MyService2"
      DisplayName="MyService2"
      Description="Some Description"
      Start="auto" 
      Account="[SERVICEACCOUNT]"
      Password="[SERVICEPASSWORD]"
      ErrorControl="normal"
      Arguments=' "Service2"'
      Vital="yes"
      Interactive="no" />
    <ServiceControl Id="ServiceControl2" Stop="uninstall" Remove="uninstall" Name="MyService2" Wait="yes" />
</Component>

В функциях:

<Feature Id="Feature1" Title="Feature 2" Level="1" Description="...">
  <ComponentRef Id="Service1_xml"/>
  <ComponentRef Id="Service1"/>
</Feature>
<Feature Id="Feature2" Title="Feature 2" Level="1" Description="...">
  <ComponentRef Id="Service2_xml"/>
  <ComponentRef Id="Service2"/>
</Feature>

Любая помощь приветствуется.

(PS. Причина, по которой я разбил их на 2 компонента, заключается в том, что я могу включить конфигурационный файл xml со службой в разделе функций. Мой установщик службы Windows принимает аргумент командной строки, чтобы узнать, какой XML-файл нужно прочитать от и настройте соответственно)

EDIT:

Ошибка вывода:

ICE30: целевой файл «hlo8twix.exe | ConnDriver.exe» устанавливается в «[ProgramFilesFolder] \ CompanyName \ ProgramName \» двумя различными компонентами в системе LFN: «Service1» и «Service2». Это нарушает подсчет ссылок компонентов.

Ответы [ 4 ]

2 голосов
/ 03 декабря 2013

В одном из моих проектов у меня есть 2 службы внутри одного исполняемого файла. Так что для обеих служб в моем exe, у меня есть следующее в моей настройке wix. Надеюсь, это поможет.

  <Component Id="MyScheduler" Guid="{SOMEGUID}">
    <File Id="MySchedulerEXE" Name="MyScheduler.exe" Source="MyScheduler.exe" KeyPath="yes" />

    <ServiceInstall Id="FirstService" Type="ownProcess" Vital="yes" Name="First Service" DisplayName="First Service" Description="First Service" Start="auto" Account="NT AUTHORITY\LocalService" Interactive="no" ErrorControl="ignore" />
    <ServiceControl Id="StartFirstService" Name="First Service" Start="install" Wait="no" />
    <ServiceControl Id="StopFirstService" Name="First Service" Stop="both" Wait="yes" Remove="uninstall" />

    <ServiceInstall Id="SecondService" Type="ownProcess" Vital="yes" Name="Second Service" DisplayName="Second Service" Description="Second Service" Start="auto" Account="NT AUTHORITY\LocalService" Interactive="no" ErrorControl="ignore" />
    <ServiceControl Id="StartSecondService" Name="Second Service" Start="install" Wait="no" />
    <ServiceControl Id="StopSecondService" Name="Second Service" Stop="both" Wait="yes" Remove="uninstall" />

  </Component>
0 голосов
/ 06 июня 2017
<?xml version="1.0" encoding="UTF-8"?>
<!-- The name of the product -->
<?define Service1Name = "Test Service1" ?>
<?define Service2Name = "Test Service2" ?>
<!-- The description of the product -->
<?define Service1Description = "Test Service1 that logs dummy text on an interval to a text file." ?>
<?define Service2Description = "Test Service2 that logs dummy text on an interval to a text file." ?>
<!-- The manufacturer, for setup package publisher and folder info -->
<?define Manufacturer = "Your Company" ?>
<!-- The version number of this setup package-->
<?define Version = "1.0.1" ?>
<!-- UpgradeCode must be unique and not changed once the first version of the program is installed. -->
<?define UpgradeCode = "{1240E0CD-B3D2-44A7-B064-11B3C0709D69}" ?>

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="$(var.Service1Name)" Manufacturer="$(var.Manufacturer)" UpgradeCode="$(var.UpgradeCode)" Version="$(var.Version)" Language="1033">
    <!-- Create a folder inside Your Company called Test Service -->
    <Package InstallerVersion="300" Compressed="yes"/>
    <!-- Create a folder inside Your Company called Test Service -->
    <Media Id="1" Cabinet="TestService.cab" EmbedCab="yes" />
    <!-- Allow upgrades and prevent downgrades -->
    <MajorUpgrade DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." />
    <!-- Define the directory structure -->
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <!-- Create a folder inside program files called Your Company -->
        <Directory Id="ROOTDIRECTORY" Name="$(var.Manufacturer)">
          <!-- Create a folder inside Your Company called Test Service -->
          <Directory Id="INSTALLFOLDER" Name="$(var.Service1Name)" />
        </Directory>
      </Directory>
    </Directory>
    <!-- The files inside this DirectoryRef are linked to the Test Service directory via INSTALLFOLDER -->
    <DirectoryRef Id="INSTALLFOLDER">
      <!-- Create a single component which is the TestService.exe file -->
      <Component Id="$(var.TestService1.TargetFileName)">
        <!-- Copies the TestService.exe file using the project reference preprocessor variables -->
        <File Id="$(var.TestService1.TargetFileName)" Source="$(var.TestService1.TargetPath)" KeyPath="yes" />
        <!-- Remove all files from the INSTALLFOLDER on uninstall -->
        <RemoveFile Id="RemoveService1" Name="*.*" On="both" />
        <!-- Tell WiX to install the Service -->
        <ServiceInstall Id="Service1Installer"
        Type="ownProcess"
        Name="TestService1"
        DisplayName="$(var.Service1Name)"
        Description="$(var.Service1Description)"
        Start="auto"
        ErrorControl="normal" />
        <!-- Tell WiX to start the Service -->
        <ServiceControl Id="StartService1" Start="install" Stop="both" Remove="uninstall" Name="TestService1" Wait="yes" />
      </Component>
      <!-- Create a single component which is the TestService.exe file -->
      <Component Id="$(var.TestService2.TargetFileName)">
        <!-- Copies the TestService.exe file using the project reference preprocessor variables -->
        <File Id="$(var.TestService2.TargetFileName)" Source="$(var.TestService2.TargetPath)" KeyPath="yes" />
        <!-- Remove all files from the INSTALLFOLDER on uninstall -->
        <RemoveFile Id="RemoveService2" Name="*.*" On="both" />
        <!-- Tell WiX to install the Service -->
        <ServiceInstall Id="Service2Installer"
        Type="ownProcess"
        Name="TestService2"
        DisplayName="$(var.Service2Name)"
        Description="$(var.Service2Description)"
        Start="auto"
        ErrorControl="normal" />
        <!-- Tell WiX to start the Service -->
        <ServiceControl Id="StartService2" Start="install" Stop="both" Remove="uninstall" Name="TestService2" Wait="yes" />
      </Component>
    </DirectoryRef>
    <!-- Tell WiX to install the files -->
    <Feature Id="Feature1" Title="TestService1.Setup" Level="1">
      <ComponentRef Id="$(var.TestService1.TargetFileName)" />
    </Feature>
    <Feature Id="Feature2" Title="TestService2.Setup" Level="1">
      <ComponentRef Id="$(var.TestService2.TargetFileName)" />
    </Feature>
  </Product>
</Wix>
0 голосов
/ 19 февраля 2016

Наконец-то нашел решение.для нескольких служб в одном и том же exe-файле вы должны установить Type = "shareProcess" в элементе ServiceInstall, и обе службы будут работать нормально.Я выяснил это, установив мой сервис с помощью «InstallUtil», и сравнил структуру реестра.«InstallUtil» установил тип для ownProcess, поэтому я изменил мой в инсталляторе, и это сработало как чудо.

<Component Id="MyScheduler" Guid="{SOMEGUID}">
<File Id="MySchedulerEXE" Name="MyScheduler.exe" Source="MyScheduler.exe" KeyPath="yes" />

    <ServiceInstall Id="FirstService" Type="shareProcess" Vital="yes" Name="First Service" DisplayName="First Service" Description="First Service" Start="auto" Account="NT AUTHORITY\LocalService" Interactive="no" ErrorControl="ignore" />
    <ServiceControl Id="StartFirstService" Name="First Service" Start="install" Wait="no" />
    <ServiceControl Id="StopFirstService" Name="First Service" Stop="both" Wait="yes" Remove="uninstall" />

    <ServiceInstall Id="SecondService" Type="shareProcess" Vital="yes" Name="Second Service" DisplayName="Second Service" Description="Second Service" Start="auto" Account="NT AUTHORITY\LocalService" Interactive="no" ErrorControl="ignore" />
    <ServiceControl Id="StartSecondService" Name="Second Service" Start="install" Wait="no" />
    <ServiceControl Id="StopSecondService" Name="Second Service" Stop="both" Wait="yes" Remove="uninstall" />

  </Component>
0 голосов
/ 02 февраля 2012

Компонент может принадлежать более чем одной функции.Создайте один компонент для вашей службы, затем несколько функций: каждая функция имеет ComponentRef для одного компонента службы и любые другие ссылки, в которых она нуждается.

...