Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Setup: Update eines Windows Dienstes: "Der angegebene Dienst ist bereits vorhanden"
caldicot
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

Setup: Update eines Windows Dienstes: "Der angegebene Dienst ist bereits vorhanden"

beantworten | zitieren | melden

Hi,

ich habe ein Setup Projekt gemacht, das einen Windows Dienst installiert. Das klappt auch.
Bei einem Update habe ich Assembly und die Setup Version erhöht.

Folgende Eigenschaften habe ich beim Setup gesetzt:
  • DetectNewerInstalledVersion = True
  • RemovePreviousVersions = True


Wenn ich aber das geupdatete Setup auf einer Maschine ausführe, auf der bereits der Windows Dienst installiert ist, kommt während dem Setup die Fehlermeldung "Der angegebene Dienst ist bereits vorhanden".

Ich hätte gehofft, das Setup entfernt die alte Installation bevor die neue Version installiert wird.
Oder überschreibt die alte Version mit der Neuen?

Könnte mir bitte jemand weiter helfen?

Danke
caldicot
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2.295

beantworten | zitieren | melden

Problem wird die Registrierung des Dienstes sein, die im Normalfall nur bei erstinstallation ausgeführt werden muss.
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
Nadril
myCSharp.de - Member



Dabei seit:
Beiträge: 6

beantworten | zitieren | melden

Dafür musst du ein Major Upgrad durchführen.
Das heißt die Versionsnummer deines Installers muss an der dritten Stelle erhöht werden.
Also zb. von 1.1.1 auf 1.1.2
Des weiteren darf sich der UpgradeCode des Installers in den verschiedenen Versionen nicht unterscheiden. Der ProductCode muss aber für ein Major-Upgrade geändert werden.
So mach ich das zumindest immer bei meinen Setups.
Die erstelle ich allerdings mit dem Windows Installer Xml

Gruß Nadril
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Nadril am .
private Nachricht | Beiträge des Benutzers
caldicot
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

Hi,

danke für Eure Antworten.
Ich habe gerade probiert die Versionsnummer an der dritten Stelle zu erhöhen.
Den ProductCode habe ich geändert. UpgradeCode ist gleich geblieben.

Leider ohne gewünschtem Ergebnis.
Beim Installieren kommt der selbe Fehler.

Könnte ich die Dienst Registrierung mit einem CustomInstaller bei bereits vorhandener Installation überspringen?

Habt Ihr noch eine Idee?

Danke
caldicot
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von caldicot am .
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2.295

beantworten | zitieren | melden

Wie wird die Registrierung des Dienstes durchgeführt?
Mittels installutil aus einer Batch heraus?
Stellt deine Setup-Anwendung das bereits bereit?
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
caldicot
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

Das macht das Setup Projekt für mich.
Ich habe unter Ansicht->Benutzerdefinierte Aktionen das Dienst-Projekt zu allen 4 Kategorieren (Installieren, Commit ausführen, Rollback, Deinstallieren) hinzugefügt.
Damit wird der Dienst registriert.
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 538
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

Du kannst eine Anpassung im Installer machen, so dass er überprüft ob dein Dienst schon vorhanden ist, und wen ja lässt du ihn einfach nicht auf base.OnInstall() los, sondern machst einfach nichts.
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
private Nachricht | Beiträge des Benutzers
caldicot
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

Hi,

danke für den Tipp, ich habe versucht das umzusetzen leider funktioniert es nicht.
Zusätzlich zur Install Methode habe ich die OnAfterInstall Methode überschrieben um den Dienst nach der Installation automatisch zu starten.
So sieht der Code aus:


    [RunInstaller(true)]
    public partial class ProjectInstaller : System.Configuration.Install.Installer
    {
        public ProjectInstaller()
        {
            InitializeComponent();
        }

        public override void Install(IDictionary stateSaver)
        {
            if(!ServiceAlreadyInstalled(serviceInstaller.ServiceName))
                base.Install(stateSaver);
        }

        private static bool ServiceAlreadyInstalled(string serviceName)
        {
            ServiceController[] allServices = ServiceController.GetServices();
            return allServices.Any(sc => sc.ServiceName == serviceName);
        }

        protected override void OnAfterInstall(IDictionary savedState)
        {
            base.OnAfterInstall(savedState);

            ServiceController sc = new ServiceController(serviceInstaller.ServiceName);
            int count = 10;

            if (sc.Status == ServiceControllerStatus.Stopped)
            {
                sc.Start();
                while (sc.Status == ServiceControllerStatus.Stopped && count > 0)
                {
                    Thread.Sleep(1000);
                    sc.Refresh();
                    count--;
                }
            }
        }

Habe ich vielleicht irgendwas falsch gemacht?
Der Fehler bleibt der Selbe...

Danke
caldi
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 538
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

Es besteht durchaus die Möglichkeit, dass der Dienst nicht in der InstallPhase sondern in der Committ-Phase im SC eingetragen wird, aber das weiß ich leider nicht auf anhieb - ist länger her, dass ich mich damit befasst habe.

Ansonsten: Die Deinstallation des Dienstes könnte scheitern, weil der Dienst läuft - vielleicht hilft schon stoppen im deinstaller?

Du wirst mal ein wenig experimentieren müssen ;-)
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
private Nachricht | Beiträge des Benutzers
caldicot
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

Ok, danke :)
Du hast Dich vorher so sicher angehört, da bin ich gar nicht auf die Idee gekommen, dass ich eine andere Methode probieren könnte zu überschreiben ..

Ich melde mich, wenn ichs ausprobiert habe ..
private Nachricht | Beiträge des Benutzers
caldicot
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

irgendwie scheint es gar nicht zu klappen.
Ich habe jeweils einzeln die Commit Methode und die Install Methode so überschrieben, dass die base Methode nur dann aufgerufen wird, wenn der Dienst nicht bereits installiert ist.
Ich habe es mit beiden Methoden gleichzeitig versucht.
Jedesmal habe ich die Major Versionnummer erhöht und den ProductCode verändert (UpdateCode ist gleich geblieben). Der Dienst war zum Zeitpunkt der Installation aus.
Trotzdem kam jedesmal die selbe Fehlermeldung, dass der Dienst bereits installiert sei.

Ich bin etwas ratlos, an was es noch liegen könnte?

Danke
caldi
private Nachricht | Beiträge des Benutzers
caldicot
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

Ich habe gerade auch nochmal probiert, die Commit und Install Methode mit einem return zu beenden ohne die Base Methode oder irgend einen anderen Code auszuführen.
Leider ebenfalls ohne Erfolg.
Es scheint als würde die Dienst Registrierung nicht hier statt finden.

Könnt Ihr mir weiterhelfen?
private Nachricht | Beiträge des Benutzers
caldicot
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

Hi,

ich habe testweise die Benutzerdefinierte Aktion "Installieren" gelöscht.
Dann wird der Dienst tatsächlich nicht registriert. Getestet habe ich es ohne dass der Dienst davor installiert war.

Daher verstehe ich nicht, warum der erste Lösungsansatz von Grumbler85 nicht funktionierte.

Ich habe außerdem probiert eine Condition bei der Installieren Aktion anzulegen.
Eine MSDN-Dokumentation habe ich dazu leider nicht gefunden.
Folgende Condtions habe ich bereits probiert:
  • (Not Installed) OR PREVIOUSVERSIONSINSTALLED
  • Not Installed
  • NOT Installed

Ich habe gelesen, dass die Anweisung case-sensitive ist.

Vermutlich sind die Bedingungen falsch und deswegen wird die Benutzerdefinierte Aktion trotzdem ausgeführt.

Habt Ihr vielleicht eine Idee, wie die Condition richtig heißen muss?

Danke
caldi
private Nachricht | Beiträge des Benutzers
caldicot
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

Hat keiner mehr eine Idee?
Ich konnte das Problem immer noch nicht lösen?

Würde das vielleicht mit Wix besser gehen?
Ich habe damit bisher keinerlei Erfahrung?

Danke
caldi
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo caldicot,

eine inhaltliche Idee habe ich nicht. Aber möglicherweise ist dein System nach den ganzen Versuchen einfach "aus dem Tritt" gekommen. Ich würde an deiner Stelle mal ein komplett neues Setup erstellen, wie du nach den ganzen Hinweisen meinst, dass es richtig wäre. Und dieses dann auf einem anderen, unbelasteten Rechner probieren.

herbivore
private Nachricht | Beiträge des Benutzers