Frage

Wie installiere ich einen Dienst mit einigen zusätzlichen Dateien in WiX, und festlegen, welche Datei ist die eigentliche Dienst EXE-Datei?

Szenario: Ich hatte einen Dienst, der nur eine einzelne EXE-Datei war, und installierte es als Windows NT-Dienst in WiX mit diesem 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>

und ich hatte eine Funktion, die dann erlauben würde, installieren und gegebenenfalls diesen Dienst starten.

Nun, mein Problem ist - jetzt mein Service ist gewachsen, und die einzelne EXE ist nicht mehr eine einzelne EXE -. Es mehrere Dateien ist, EXE, DLL, und ein paar Support-Dateien

Wie aber kann ich installieren, dass jetzt ??

Ich habe versucht, eine Komponente mit allen meinen Dateien haben

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

Zuerst habe ich versucht, nur die Serviceinstall und Servicecontrol-Tags hinzufügen, auf diese Komponente:

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

aber dann mein „Framework.dll“ wird als Quellpfad für den Dienst eingestellt erstellt werden ........

Also dachte ich, ich eine zweite Komponente schaffen würde, um tatsächlich den Dienst zu installieren, mit Serviceinstall, und ich würde nur diese Dienst EXE-Datei mit FileRef Referenz - aber das scheint nicht (zumindest in Wix2) zu existieren.

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

Also - was ist ein schlechter WiX Autor muss tun, alle notwendigen Dateien zu installieren, und immer noch die NT Service Installation erhalten, um die richtige EXE-Datei (nicht nur jede beliebige Datei aus der Komponente Liste der Dateien) abholen ??

Marc

War es hilfreich?

Lösung

Das Serviceinstall Element wird zeigen am Ende auf die „KeyPath“ der Komponente der Serviceinstall in ist. Standardmäßig ist der WiX-Toolset die erste Datei oder RegistryKey Element in Ihrer Komponente als KeyPath nimmt. Wenn Sie Dateien auf Ihre Komponente hinzugefügt, die DLL an der Spitze der Liste wurde der KeyPath.

In der Regel kleinere Komponenten sind besser als größere. So eine bessere Lösung wäre, um Ihre DLLs in separaten Komponenten zu platzieren. Dann können Sie das EXE-Datei-Element und das Serviceinstall Element in der gleichen Komponente verlassen. Das macht es alles sehr sauber.

Wenn Sie dann den „Dienst“ gruppiert werden sollen zusammen, können Sie ein ComponentGroup Element erstellen und setzen ComponentRefs auf die EXE und DLL-Komponenten. Jetzt haben Sie eine einzige Sache, die Sie von einem Feature / ComponentGroupRef verweisen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top