Inno Setup pour le service Windows?

105

J'ai un service Windows .Net. Je souhaite créer un programme d'installation pour installer ce service Windows.

Fondamentalement, il doit faire ce qui suit:

  1. Pack installutil.exe(est-ce nécessaire?)
  2. Exécutez installutil.exeMyService.exe
  3. Démarrez MyService

En outre, je souhaite fournir un programme de désinstallation qui exécute la commande suivante:

installutil.exe /u MyService.exe

Comment procéder avec Inno Setup?

devnull
la source
Je pense que vous devez utiliser la section [Exécuter]. Voir ici
Preet Sangha

Réponses:

233

Vous n'en avez pas besoin installutil.exeet vous n'avez probablement même pas le droit de le redistribuer.

Voici comment je le fais dans mon application:

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());
    }
}

Fondamentalement, vous pouvez demander à votre service d'installer / de désinstaller seul en utilisant ManagedInstallerClasscomme indiqué dans mon exemple.

Ensuite, il suffit d'ajouter dans votre script InnoSetup quelque chose comme ceci:

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

[UninstallRun]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--uninstall"
lubos hasko
la source
3
vous pouvez essayer Filename: "net.exe"; Parameters: "start WinServ". si cela ne fonctionne pas, vous pouvez simplement ajouter un autre commutateur --start à votre application c # et démarrer le service Windows directement à partir du programme en utilisant la classe ServiceController ( msdn.microsoft.com/en-us/library/… ).
lubos hasko
2
+1 Nice. Voir aussi stackoverflow.com/questions/255056/…
Ruben Bartelink
7
Pour le C # néophyte (comme moi), vous devez soit d'ajouter un using System.Reflection;ou changement Assemblyà System.Reflection.Assemblydans le code ci - dessus.
rlandster
1
InstallUtil fait partie du framework dot net, vous n'avez pas besoin de "droits" pour le redistribuer, il est déjà présent sur votre système cible (en supposant que vous puissiez exécuter votre application en premier lieu bien sûr)
Andrew Savinykh
10
De la documentation sur la méthode InstallHelper dans 4.5 - «Cette API prend en charge l'infrastructure .NET Framework et n'est pas destinée à être utilisée directement à partir de votre code.» Découvert après avoir reçu System.InvalidOperationException.
Bratch le
8

Voici comment je l'ai fait:

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

Apparemment, la configuration d'Inno a les constantes suivantes pour référencer le dossier .NET sur votre système:

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

Plus d'informations disponibles ici .

brise
la source
5

Vous pouvez utiliser

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

pour créer un service. Voir " sc.exe " pour savoir comment démarrer, arrêter, vérifier l'état du service, supprimer le service, etc.

Steven
la source
2

Si vous souhaitez éviter les redémarrages lors de la mise à niveau de l'utilisateur, vous devez arrêter le service avant de copier l'exe et recommencer après.

Il existe des fonctions de script pour le faire dans Service - Fonctions pour démarrer, arrêter, installer, supprimer un service

Tony Edgecombe
la source
Dans votre article lié, les prototypes des fonctions utilisées ne sont pas traduits avec précision et leur utilisation n'est pas non plus correcte (il n'y a par exemple pas d'attente pour que le service démarre, s'arrête, etc.).
TLama du