2009-08-12 6 views
5

Comment installer un service avec des fichiers supplémentaires dans WiX et définir quel fichier est le fichier EXE du service?Installation d'un service NT multi-fichiers à l'aide de WiX (2.0)

Scénario: J'avais un service qui était juste un seul fichier EXE et installé en tant que service Windows NT dans WiX avec ce code:

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

et j'avais une caractéristique qui permettrait ensuite d'installer et éventuellement démarrer ce service.

Maintenant, mon problème est - maintenant mon service a grandi, et le seul EXE n'est plus un seul EXE - c'est plusieurs fichiers, EXE, DLL, et quelques fichiers de support.

Cependant, comment puis-je l'installer maintenant?

J'ai essayé d'avoir un composant avec tous mes fichiers

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

d'abord, j'ai essayé d'ajouter juste le ServiceInstalle et les balises serviceControl à ce composant:

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

mais mon « cadre. dll "est défini comme le chemin d'accès source pour le service en cours de création ........

J'ai donc pensé créer un second composant pour installer le service en utilisant ServiceInstall , et je ferais simplement référence à ce fichier EXE de service en utilisant FileRef - mais cela ne semble pas exister (au moins dans 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> 

Alors - ce qui est un pauvre auteur WiX dois faire pour installer tous les fichiers nécessaires, et toujours obtenir l'installation de service NT pour récupérer le fichier EXE correct (pas seulement un fichier arbitraire de la liste des fichiers du composant) ??

Marc

+1

Vous avez oublié de définir KeyPath = 'yes' sur l'exe dans l'élément File. –

+0

Merci, Shay - La réponse de Rob semble confirmer votre déclaration - grandement appréciée! –

Répondre

7

L'élément ServiceInstall finira pointant vers le « KeyPath » du composant le ServiceInstalle est. Par défaut, le jeu d'outils WiX prend le premier fichier ou élément RegistryKey dans votre composant comme KeyPath. Lorsque vous avez ajouté des fichiers à votre composant, le fichier .dll en haut de la liste devenait KeyPath.

En règle générale, les composants plus petits sont meilleurs que les composants plus gros. Donc, une meilleure solution serait de placer vos DLL dans des composants distincts. Vous pouvez ensuite laisser l'élément .exe File et l'élément ServiceInstall dans le même composant. Cela rend tout très propre. Si vous voulez que le "service" soit regroupé, vous pouvez créer un élément ComponentGroup et placer ComponentRefs dans les composants .exe et .dll. Maintenant vous avez une seule chose que vous pouvez référencer à partir d'un Feature/ComponentGroupRef.

+0

+1 Bonne explication - merci beaucoup, Rob! J'ai changé mon script WiX en conséquence et je rapporterai demain une fois la compilation nocturne exécutée et l'installation testée :-) –

+0

Oui, confirmée - l'ajout du "KeyPath = 'yes'" a résolu mon problème - l'installation est de nouveau fonctionnelle très bien - merci beaucoup, Rob! –

Questions connexes