Установка многофайловой службы NT с помощью WiX (2.0)

Как мне установить службу с некоторыми дополнительными файлами в WiX и определить, какой файл является фактическим файлом EXE службы?

Сценарий: у меня была служба, представляющая собой всего лишь один EXE-файл, и я установил ее как службу Windows NT в WiX с помощью этого кода:

<Component Id='InstallMyServiceComponent' Guid='{....}' DiskId='1'>
   <File Id='InstallMyServiceEXEFile' LongName='MyService.exe' 
         Name='MyServ.exe' src='MyService/bin/release/MyService.exe' KeyPath='yes'/>
   <ServiceInstall Id='InstallMyService' Name='MyService' Description='My Service'
         ErrorControl='normal' Start='auto' Type='ownProcess' Vital='yes' />
   <ServiceControl Id='UninstallMyService' Name='MyService' Remove='uninstall' 
         Wait='yes' />
</Component>
<Component Id='RunMyServiceComponent' Guid='.......'>
   <ServiceControl Id='RunMyService' Name='MyService' Start='install' 
         Stop='uninstall' Wait='no' />
</Component>

и у меня была функция, которая затем позволяла установить и, при желании, запустить эту службу.

Теперь моя проблема в том, что моя служба выросла, и один EXE больше не является одним EXE - это несколько файлов, EXE, DLL и несколько вспомогательных файлов.

Однако как я могу это установить сейчас?

Я пытался иметь компонент со всеми моими файлами

<Component Id="MyService" Guid="......" DiskId="1">
  <File Id="fileMyService_framework_dll" LongName="Framework.dll" 
        Name="Framewrk.DLL" src="MyService\Framework.dll" />
  <File Id="fileMyService_dal_dll" LongName="MyServiceDAL.dll" 
        Name="SrvcDAL.DLL" src="MyService\ServiceDAL.dll" />
  <File Id="fileMyService_helpers_dll" LongName="Helpers.dll" 
        Name="Helpers.DLL" src="MyService\Helpers.dll" />
  <File Id="fileMyService_exe" LongName="MyService.exe" 
        Name="MySrv.EXE" src="MyService\MyService.exe" />
</Component>

Сначала я попытался просто добавить в этот компонент теги ServiceInstall и ServiceControl:

<Component Id="MyService" Guid="......" DiskId="1">
  <File Id="fileMyService_framework_dll" LongName="Framework.dll" 
        Name="Framewrk.DLL" src="MyService\Framework.dll" />
  <File Id="fileMyService_dal_dll" LongName="MyServiceDAL.dll" 
        Name="SrvcDAL.DLL" src="MyService\ServiceDAL.dll" />
  <File Id="fileMyService_helpers_dll" LongName="Helpers.dll" 
        Name="Helpers.DLL" src="MyService\Helpers.dll" />
  <File Id="fileMyService_exe" LongName="MyService.exe" 
        Name="MySrv.EXE" src="MyService\MyService.exe" />
   <ServiceInstall Id='InstallMyService' Name='MyService' 
        Description='My Service' ErrorControl='normal' Start='auto' 
        Type='ownProcess' Vital='yes' />
   <ServiceControl Id='UninstallMyService' Name='MyService' 
        Remove='uninstall' Wait='yes' />
</Component>

но затем мой "Framework.dll" устанавливается как исходный путь для создаваемой службы ........

Поэтому я решил создать второй компонент для фактической установки службы с помощью ServiceInstall и просто сослаться на этот EXE-файл службы с помощью FileRef, но этого, похоже, не существует (по крайней мере, в Wix2).

<Component Id='InstallMyServiceComponent' Guid='{....}' DiskId='1'>
   <FileRef Id='fileMyService_exe' KeyPath='yes'/>
   <ServiceInstall Id='InstallMyService' Name='MyService' 
         Description='My Service' ErrorControl='normal' Start='auto' 
         Type='ownProcess' Vital='yes' />
   <ServiceControl Id='UninstallMyService' Name='MyService' 
         Remove='uninstall' Wait='yes' />
</Component>

Итак - что должен сделать плохой автор WiX, чтобы установить все необходимые файлы и при этом заставить установку NT Service выбрать правильный EXE-файл (а не просто произвольный файл из списка файлов компонента) ??

Марк


person marc_s    schedule 12.08.2009    source источник
comment
Вы забыли установить KeyPath = 'yes' для exe в элементе File.   -  person Shay Erlichmen    schedule 12.08.2009
comment
Спасибо, Шэй - ответ Роба, кажется, подтверждает ваше заявление - очень признателен!   -  person marc_s    schedule 13.08.2009


Ответы (1)


Элемент ServiceInstall в конечном итоге будет указывать на «KeyPath» компонента, в котором находится ServiceInstall. По умолчанию набор инструментов WiX выбирает первый элемент File или RegistryKey в вашем компоненте в качестве KeyPath. Когда вы добавляли файлы в свой компонент, .dll в верхней части списка становилась KeyPath.

В общем, меньшие компоненты лучше, чем большие. Поэтому лучшим решением было бы разместить ваши библиотеки DLL в отдельных компонентах. Затем вы можете оставить элемент .exe File и элемент ServiceInstall в одном и том же компоненте. Это делает все очень чистым.

Если затем вы хотите, чтобы «служба» была сгруппирована вместе, вы можете создать элемент ComponentGroup и поместить ComponentRefs в компоненты .exe и .dll. Теперь у вас есть одна вещь, на которую вы можете ссылаться из Feature / ComponentGroupRef.

person Rob Mensching    schedule 12.08.2009
comment
+1 Отличное объяснение - большое спасибо, Роб! Я соответствующим образом изменил свой сценарий WiX и сообщу завтра, как только будет запущена ночная сборка и установка будет протестирована :-) - person marc_s; 13.08.2009
comment
Да, подтверждено - добавление KeyPath = 'yes' решило мою проблему - установка вернулась к нормальной работе - большое спасибо, Роб! - person marc_s; 13.08.2009