Domanda

Come posso installare un servizio con alcuni file aggiuntivi in ​​WiX e definire quale file è l'effettivo file EXE del servizio?

Scenario:Avevo un servizio che era solo un singolo file EXE e l'ho installato come servizio Windows NT in WiX con questo codice:

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

e avevo una funzionalità che consentiva quindi di installare e facoltativamente avviare questo servizio.

Ora, il mio problema è che il mio servizio è cresciuto e il singolo EXE non è più un singolo EXE: sono più file, EXE, DLL e alcuni file di supporto.

Tuttavia, come posso installarlo ora??

Ho provato ad avere un componente con tutti i miei file

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

Innanzitutto, ho provato ad aggiungere semplicemente i tag ServiceInstall e ServiceControl a questo 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>

ma poi il mio "Framework.dll" viene impostato come percorso di origine per il servizio in fase di creazione........

Quindi ho pensato di creare un secondo componente per installare effettivamente il servizio, utilizzando ServiceInstall, e farei semplicemente riferimento a quel file EXE del servizio utilizzando FileRef, ma sembra che non esista (almeno in 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>

Quindi, cosa deve fare un povero autore WiX per installare tutti i file necessari e ottenere comunque l'installazione del servizio NT per raccogliere il file EXE corretto (non solo un file arbitrario dall'elenco di file del componente) ??

Marc

È stato utile?

Soluzione

L'elemento ServiceInstall finirà per puntare al "KeyPath" del componente in cui si trova ServiceInstall.Per impostazione predefinita, il set di strumenti WiX seleziona il primo elemento File o RegistryKey nel componente come KeyPath.Quando hai aggiunto file al tuo componente, il file .dll in cima all'elenco è diventato il KeyPath.

In generale, i componenti più piccoli sono migliori di quelli più grandi.Quindi una soluzione migliore sarebbe posizionare le DLL in componenti separati.Quindi puoi lasciare l'elemento File .exe e l'elemento ServiceInstall nello stesso componente.Questo rende tutto molto pulito.

Se poi desideri che il "servizio" sia raggruppato, puoi creare un elemento ComponentGroup e inserire ComponentRefs nei componenti .exe e .dll.Ora hai una sola cosa a cui puoi fare riferimento da un Feature/ComponentGroupRef.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top