2009-08-12 17 views
5

Come si installa un servizio con alcuni file aggiuntivi in ​​WiX e si definisce quale file è il vero file EXE di servizio?Installazione di un servizio NT multi-file tramite WiX (2.0)

Scenario: ho avuto un servizio che era solo un singolo file EXE, e installato come servizio di 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 ho avuto una caratteristica che avrebbe quindi consentire di installare e facoltativamente avviare questo servizio.

Ora, il mio problema è - ora il mio servizio è cresciuta, e il singolo file EXE non è più un singolo file EXE - è più file, EXE, DLL, e un paio di file di supporto.

Tuttavia, come posso installarlo ora?

ho cercato di 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> 

In primo luogo, ho cercato di aggiungere solo il ServiceInstall e tag Servicecontrol a questa 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 "Quadro. dll "viene impostato come il percorso di origine per il servizio creato .......

Così ho pensato di creare un secondo componente per installare effettivamente il servizio, utilizzando ServiceInstall e mi limito a fare riferimento a quel file EXE di servizio usando FileRef - ma questo non sembra esistere (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> 

Così - che cosa è un povero devo WiX autore non installare tutti i file necessari, e ancora ottenere l'installazione del Service NT per prendere il file EXE corretto (non una qualsiasi file arbitrario dalla lista del componente dei file) ??

Marc

+1

Hai dimenticato di impostare KeyPath = 'yes' sull'exe nell'elemento File. –

+0

Grazie, Shay - La risposta di Rob sembra confermare la tua affermazione - molto apprezzata! –

risposta

7

L'elemento ServiceInstall finirà che punta alla "KeyPath" della Componente del ServiceInstall è. Per impostazione predefinita il set di strumenti WiX raccoglie il primo file o elemento RegistryKey nel componente come il KeyPath. Quando hai aggiunto i file al componente, il file .dll in cima all'elenco diventava il KeyPath.

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

Se si desidera che il "servizio" sia raggruppato, è possibile creare un elemento ComponentGroup e inserire ComponentRefs nei componenti .exe e .dll. Ora hai una singola cosa che puoi fare riferimento a Feature/ComponentGroupRef.

+0

+1 Ottima spiegazione - grazie mille, Rob! Ho cambiato il mio script WiX di conseguenza e ti riporterò domani una volta che il build notturno verrà eseguito e l'installazione è stata testata :-) –

+0

Sì, confermato - aggiungendo il "KeyPath = 'sì'" risolto il mio problema - l'installazione è tornata a funzionare bene, grazie mille, Rob! –

Problemi correlati