Deshalb haben wir einen Windows-Dienst erstellt, um Daten an unsere Client-Anwendung weiterzuleiten, und alles läuft hervorragend. Der Client hat eine unterhaltsame Konfigurationsanforderung erstellt, für die zwei Instanzen dieses Dienstes auf demselben Server ausgeführt und so konfiguriert werden müssen, dass sie auf separate Datenbanken verweisen.
Bisher war ich nicht in der Lage, dies zu erreichen, und ich hoffte, dass meine Kollegen im Stackoverflow möglicherweise einige Hinweise geben könnten, warum.
Aktuelles Setup:
Ich habe das Projekt eingerichtet, das den Windows-Dienst enthält. Wir nennen es ab sofort AppService und die Datei ProjectInstaller.cs, die benutzerdefinierte Installationsschritte ausführt, um den Dienstnamen basierend auf einem Schlüssel in der App.config wie folgt festzulegen ::
this.serviceInstaller1.ServiceName = Util.ServiceName;
this.serviceInstaller1.DisplayName = Util.ServiceName;
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
In diesem Fall ist Util nur eine statische Klasse, die den Dienstnamen aus der Konfigurationsdatei lädt.
Von hier an habe ich zwei verschiedene Methoden ausprobiert, um beide Dienste zu installieren, und beide sind auf identische Weise fehlgeschlagen.
Die erste Möglichkeit bestand darin, einfach die erste Kopie des Dienstes zu installieren, das installierte Verzeichnis zu kopieren und umzubenennen und dann den folgenden Befehl auszuführen, nachdem die App-Konfiguration geändert wurde, um den gewünschten Dienstnamen zu ändern:
InstallUtil.exe /i AppService.exe
Als das nicht funktionierte, habe ich versucht, ein zweites Installationsprojekt zu erstellen, die Konfigurationsdatei bearbeitet und das zweite Installationsprogramm erstellt. Als ich das Installationsprogramm ausführte, funktionierte es einwandfrei, aber der Dienst wurde nicht in services.msc angezeigt, sodass ich den vorherigen Befehl für die zweite installierte Codebasis ausführte.
Beide Male habe ich die folgende Ausgabe von InstallUtil erhalten (nur relevante Teile):
Ausführen einer getätigten Installation.
Beginn der Installationsphase der Installation.
Installieren von Service App Service Two ... Service App Service Two wurde erfolgreich installiert. Erstellen des EventLog-Quell-App-Dienstes Zwei im Protokoll Anwendung ...
Während der Installationsphase ist eine Ausnahme aufgetreten. System.NullReferenceException: Objektreferenz nicht auf eine Instanz eines Objekts festgelegt.
Die Rollback-Phase der Installation beginnt.
Wiederherstellen des Ereignisprotokolls auf den vorherigen Status für Quell-App-Service Zwei. Service App Service Two wird aus dem System entfernt ... Service App Service Two wurde erfolgreich aus dem System entfernt.
Die Rollback-Phase wurde erfolgreich abgeschlossen.
Die getätigte Installation ist abgeschlossen. Die Installation ist fehlgeschlagen und das Rollback wurde durchgeführt.
Entschuldigung für den langwierigen Beitrag, wollte sicherstellen, dass es genügend relevante Informationen gibt. Das Stück, das mich bisher verblüfft hat, ist, dass es besagt, dass die Installation des Dienstes erfolgreich abgeschlossen wurde und dass die NullReferenceException erst ausgelöst wird, nachdem die EventLog-Quelle erstellt wurde. Wenn also jemand weiß, was ich falsch mache oder einen besseren Ansatz hat, wäre er sehr dankbar.
http://journalofasoftwaredev.wordpress.com/2008/07/16/multiple-instances-of-same-windows-service/
. Sie können Code in das Installationsprogramm einfügen, um den gewünschten Dienstnamen zu erhalten, wenn Sie installutil ausführen.