windows-services wix wix2

windows services - Instalación de un servicio NT de varios archivos usando WiX(2.0)



windows-services wix2 (1)

¿Cómo instalo un servicio con algunos archivos adicionales en WiX y defino qué archivo es el archivo EXE del servicio real?

Escenario: tenía un servicio que era solo un único archivo EXE, y lo instalé 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 tenía una función que luego permitiría instalar y, opcionalmente, iniciar este servicio.

Ahora, mi problema es que ahora mi servicio ha crecido y el único EXE ya no es un único EXE. Son múltiples archivos, EXE, DLL y algunos archivos de soporte.

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

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>

Primero, traté de simplemente agregar 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 luego 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, usando ServiceInstall, y simplemente haría referencia al archivo EXE del servicio usando 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>

Entonces, ¿qué tiene que hacer un pobre autor de WiX para instalar todos los archivos necesarios y aún obtener la instalación del Servicio NT para recoger el archivo EXE correcto (no cualquier archivo arbitrario de la lista de archivos del componente)?

Bagazo


El elemento ServiceInstall terminará señalando el "KeyPath" del Componente en el que se encuentra ServiceInstall. De forma predeterminada, el conjunto de herramientas de WiX selecciona el primer elemento File o RegistryKey en su Componente como KeyPath. Cuando agregó archivos a su Componente, el .dll en la parte superior de la lista se convirtió en KeyPath.

En general, los componentes más pequeños son mejores que los más grandes. Entonces, una mejor solución sería colocar sus archivos DLL en componentes separados. Luego puede dejar el elemento Archivo .exe y el elemento ServiceInstall en el mismo Componente. Eso lo hace todo muy limpio.

Si luego desea agrupar el "servicio", puede crear un elemento ComponentGroup y colocar ComponentRefs en los componentes .exe y .dll. Ahora tiene una sola cosa a la que puede hacer referencia desde Feature / ComponentGroupRef.