webentwicklung-frage-antwort-db.com.de

Inno Setup für Windows-Dienst?

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 (Wird es benötigt?)
  2. Lauf installutil.exe MyService.exe
  3. Starten Sie MyService

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

installutil.exe /u MyService.exe

Wie geht das mit Inno Setup?

102
devnull

Du brauchst nicht installutil.exe und wahrscheinlich haben Sie 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 mit ManagedInstallerClass wie in meinem Beispiel gezeigt installieren/deinstallieren.

Dann müssen Sie nur noch etwas in Ihr InnoSetup-Skript einfügen:

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

[UninstallRun]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--uninstall"
223
lubos hasko

So habe ich es gemacht:

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

Anscheinend hat Inno-Setup die folgenden Konstanten für den Verweis auf den .NET-Ordner auf Ihrem System:

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

Weitere Informationen verfügbar hier .

7
breez

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. Siehe "sc.exe" zum Starten, Beenden, Überprüfen des Dienststatus, Löschen des Dienstes usw.

3
Steven

Wenn Sie vermeiden möchten, dass der Benutzer bei einem Upgrade einen Neustart durchführt, müssen Sie den Dienst beenden, bevor Sie die EXE-Datei kopieren und anschließend neu starten.

Hierfür gibt es einige Skriptfunktionen unter Dienst - Funktionen zum Starten, Beenden, Installieren und Entfernen eines Dienstes

2
Tony Edgecombe