Inno Setup für Windows-Dienst?

105

Ich habe einen .NET Windows-Dienst. Ich möchte ein Installationsprogramm erstellen, um diesen Windows-Dienst zu installieren.

Grundsätzlich muss es folgendes tun:

  1. Pack installutil.exe(Ist es erforderlich?)
  2. Führen Sie installutil.exeMyService.exe aus
  3. Starten Sie MyService

Außerdem möchte ich ein Deinstallationsprogramm bereitstellen, das den folgenden Befehl ausführt:

installutil.exe /u MyService.exe

Wie mache ich das mit Inno Setup?

devnull
quelle
Ich denke, Sie müssen den Abschnitt [Ausführen] verwenden. Siehe hier
Preet Sangha

Antworten:

233

Sie brauchen es nicht installutil.exeund haben wahrscheinlich nicht einmal das Recht, es weiterzugeben.

So mache ich das in meiner Bewerbung:

using System;
using System.Collections.Generic;
using System.Configuration.Install; 
using System.IO;
using System.Linq;
using System.Reflection; 
using System.ServiceProcess;
using System.Text;

static void Main(string[] args)
{
    if (System.Environment.UserInteractive)
    {
        string parameter = string.Concat(args);
        switch (parameter)
        {
            case "--install":
                ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });
                break;
            case "--uninstall":
                ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });
                break;
        }
    }
    else
    {
        ServiceBase.Run(new WindowsService());
    }
}

Grundsätzlich können Sie Ihren Dienst selbst installieren / deinstallieren lassen, indem Sie ihn ManagedInstallerClasswie in meinem Beispiel gezeigt verwenden.

Dann müssen Sie Ihrem InnoSetup-Skript nur noch Folgendes hinzufügen:

[Run]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--install"

[UninstallRun]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--uninstall"
lubos hasko
quelle
3
du kannst es versuchen Filename: "net.exe"; Parameters: "start WinServ". Wenn dies nicht funktioniert, können Sie einfach einen weiteren Schalter hinzufügen --start zu Ihrer c # -Anwendung und den Windows-Dienst direkt vom Programm aus mithilfe der ServiceController-Klasse ( msdn.microsoft.com/en-us/library/… ) starten .
Lubos Hasko
2
+1 Schön. Siehe auch stackoverflow.com/questions/255056/…
Ruben Bartelink
7
Für den C # Neophyt (wie ich), müssen Sie entweder eine hinzuzufügen using System.Reflection;oder zu ändern , Assemblyum System.Reflection.Assemblyin dem obigen Code.
Rlandster
1
InstallUtil ist Teil des Dot Net Frameworks. Sie benötigen keine "Rechte", um es weiterzugeben. Es ist bereits auf Ihrem Zielsystem vorhanden (vorausgesetzt, Sie können Ihre App natürlich überhaupt
ausführen
10
Aus der Dokumentation zur InstallHelper-Methode in 4.5 - "Diese API unterstützt die .NET Framework-Infrastruktur und ist nicht für die direkte Verwendung in Code vorgesehen." Wird nach dem Empfang der System.InvalidOperationException ermittelt.
Bratch
8

So habe ich es gemacht:

Exec(ExpandConstant('{dotnet40}\InstallUtil.exe'), ServiceLocation, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);

Anscheinend verfügt das Inno-Setup über die folgenden Konstanten für die Referenzierung des .NET-Ordners auf Ihrem System:

  • {dotnet11}
  • {dotnet20}
  • {dotnet2032}
  • {dotnet2064}
  • {dotnet40}
  • {dotnet4032}
  • {dotnet4064}

Weitere Informationen finden Sie hier .

Breez
quelle
5

Sie können verwenden

Exec(
    ExpandConstant('{sys}\sc.exe'),
    ExpandConstant('create "MyService" binPath= {app}\MyService.exe start= auto DisplayName= "My Service" obj= LocalSystem'), 
    '', 
    SW_HIDE, 
    ewWaitUntilTerminated, 
    ResultCode
    )

einen Dienst erstellen. Unter " sc.exe " erfahren Sie, wie Sie den Dienststatus starten, stoppen, überprüfen, den Dienst löschen usw.

Steven
quelle
2

Wenn Sie Neustarts beim Upgrade des Benutzers vermeiden möchten, müssen Sie den Dienst vor dem Kopieren der Exe beenden und danach erneut starten.

Es gibt einige Skriptfunktionen, um dies unter Service zu tun - Funktionen zum Starten, Stoppen, Installieren und Entfernen eines Service

Tony Edgecombe
quelle
In Ihrem verlinkten Artikel werden Prototypen der verwendeten Funktionen nicht genau übersetzt und ihre Verwendung ist auch nicht korrekt (es wird z. B. nicht darauf gewartet, dass der Dienst gestartet, gestoppt usw. wird).
TLama