2010-08-13 11 views
9

In Windows Install XML-Toolset, um einen Dienst zu installieren, gruppieren wir <ServiceInstall> mit einem <File> in einem <Component>. Um den Service bedingt zu installieren, setzen wir <Condition> unter <Component>. Wenn die Bedingung jedoch falsch ist, wird die Datei auch nicht installiert. Wenn ich die <File> in eine bedingungslose <Component> setzen, dann hat der Dienst keinen ausführbaren Dateipfad und somit wird die Installation fehlschlagen. Wenn ich die <File> in beide <Component> setze, werden doppelte Symbole gefunden.WiX: InstallService bedingt, aber Datei unbedingt installieren

Die Frage ist, können wir einen Service bedingt installieren, aber die zugehörige ausführbare Datei unbedingt installieren?

Danke!

+1

Es wäre wirklich nett, wenn das ServiceInstall/@ Start-Attribut auf [Eigenschaft] gesetzt werden kann, so dass Sie den Dienst weiterhin installieren können, ohne ihn zu starten. – Ivan

Antwort

5

Erstellen Sie zwei Komponenten mit den verschiedenen GUIDs und Ids und sich gegenseitig ausschließenden Bedingungen: eine für die Datei und Service und eine andere für die Datei. Etwas wie folgt aus:

<Component Id="SvcComp" Guid="{YOUR-GUID}" SharedDllRefCount="yes"> 
    <Condition> SOME_CONDITION </Condition> 
    <File Id="SvcFile" Name="Service.exe" Source="Service.exe" Vital="yes" /> 
    <ServiceInstall Id="Svc" Name="Service" DisplayName="Service" Description="Service" Type="ownProcess" Start="auto" ErrorControl="normal" Vital="yes" /> 
    <ServiceControl Id="Svc" Name="Service" Stop="both" Remove="uninstall" Wait="yes" /> 
</Component> 

<Component Id="ExeComp" Guid="{YYOUR-GUID}" SharedDllRefCount="yes" > 
    <Condition> NOT SOME_CONDITION </Condition> 
    <File Id="ExeFile" Name="Service.exe" Source="Service.exe" Vital="yes" /> 
</Component> 

Sie erhalten eine LGHT1076 Warnung erhalten, die, da die Bedingungen in den Komponenten sich gegenseitig ausschließen unterdrückt werden konnte.

+0

Dank Ihres Ratschlags habe ich festgestellt, dass ich die Datei-ID verpasst habe. Mit einer anderen ID, aber demselben Namen, kann dieselbe Datei in verschiedenen '' existieren. –

+1

Das funktioniert technisch, aber Sie erhalten ICE-Validierungsfehler, weil die beiden Komponenten den gleichen Schlüsselpfad haben. Es ist keine saubere Lösung. –

1

Ich war auf dieser Straße und es wird komplizierter, als man es erwarten würde.

Ich denke, zwei Komponenten (trotz ihrer gegenseitig ausschließenden Bedingungsausdrücke) mit derselben Schlüsseldatei, aber verschiedene ServiceInstall/Control-Ressourcen eine Komponente Regelverletzung.

Die Art, wie ich vorschlage, es zu tun, ist, alle Ihre Geschäftslogik in eine separate DLL-Komponente zu verschieben und zwei verschiedene EXE-Komponenten zu erstellen. Stellen Sie eine als Konsole/Windows-App und die andere als Service-App auf. Ordnen Sie die Komponenten zwei verschiedenen Funktionen zu, damit der Endbenutzer entscheiden kann, auf welche Weise er die Anwendung konfigurieren möchte. Der Benutzer kann dann eine Änderungsoperation in Hinzufügen/Entfernen-Programmen durchführen und MSI verwenden, um später seine Meinung zu ändern.

2

Wenn Sie nur einen Service haben, können Sie die Serviceaktionen in der Tabelle InstallExecuteSequence konditionieren.

Alternativ muss eine Zertifizierungsstelle während der sofortigen Phase ausgeführt werden, die den Eintrag vorübergehend aus den Servicetabellen entfernt, bevor sie während der Zurückstellung ausgeführt wird.

Ich bin kein Fan der Spaltung der DLL ohne Grund.

+0

Es ist ein richtiger Anwendungsentwurf, den Code in mehreren Klassen in mehreren Assemblys zu berücksichtigen. Sie erstellen eine Assembly mit den Serverkomponenten, und Sie erstellen zwei Assemblys, die als Konsolenhost und als Servicehost fungieren. Die Vorschläge, die Sie treffen, erstellen nur Hack-MSIs, die nicht den Best Practices entsprechen. –

Verwandte Themen