Pregunta

¿Cómo se instala un servicio con algunos archivos adicionales en WiX, y definir qué archivo es el archivo real servicio EXE?

Escenario: Yo tenía un servicio que era sólo un único archivo EXE, y se instala como un servicio de Windows NT en WiX con este código:

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

y que tenía una característica que permitiría entonces de instalar y opcionalmente iniciar este servicio.

Ahora, mi problema es - ahora mi servicio ha crecido, y el único archivo EXE ya no es un único archivo EXE -. Que es varios archivos, EXE, DLL, y algunos archivos de soporte

Sin embargo, ¿cómo puedo instalar ahora que ??

Me trató de tener un componente con todos mis archivos

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

En primer lugar, he intentado sólo tiene que añadir las etiquetas ServiceInstall y Servicecontrol a este componente:

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

pero entonces mi "Framework.dll" se establece como la ruta de origen para el servicio que se está creando ........

Así que pensé en crear un segundo componente para instalar realmente el servicio, utilizando ServiceInstall, y acababa de hacer referencia a ese archivo EXE con el servicio de fileRef - pero eso no parece existir (al menos en 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>

Por lo tanto - lo que es un pobre WiX autor que hacer para instalar todos los archivos necesarios, y aún así obtener la instalación de servicio de NT para recoger el archivo EXE correcta (no cualquier archivo arbitrario de la lista del componente de archivos) ??

Marc

¿Fue útil?

Solución

El elemento ServiceInstall terminará apuntando a la "KeyPath" del componente del ServiceInstall está. Por defecto el conjunto de herramientas WiX recoge el primer archivo o elemento de RegistryKey en su componente como el KeyPath. Al agregar archivos a su componente, el .dll en la parte superior de la lista se convirtió en el KeyPath.

En general, los componentes más pequeños son mejores que las grandes. Por lo que una solución mejor sería colocar sus archivos DLL en componentes separados. A continuación, puede salir del elemento del archivo .exe y el elemento ServiceInstall en el mismo componente. Eso hace que sea todo muy limpio.

Si a continuación desea que el "servicio" de forma conjunta, se puede crear un elemento de ComponentGroup y poner ComponentRefs al .exe y .dll componentes. Ahora usted tiene una sola cosa que puede hacer referencia a una característica / ComponentGroupRef.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top