106 votes

Service Inno Setup pour Windows ?

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

En gros, il doit faire ce qui suit :

  1. Pack installutil.exe (Est-ce obligatoire ?)
  2. Exécuter installutil.exe MyService.exe
  3. Démarrer MyService

Aussi, je veux fournir un désinstalleur qui exécute la commande suivante :

installutil.exe /u MyService.exe

Comment faire cela avec Inno Setup ?

0 votes

Je pense que vous devez utiliser la section [Run]. Voir aquí

240voto

lubos hasko Points 13669

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

Voici comment je procède 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 faire en sorte que votre service s'installe/désinstalle de lui-même en utilisant ManagedInstallerClass comme indiqué dans mon exemple.

Il suffit alors d'ajouter dans votre InnoSetup script quelque chose comme ceci :

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

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

0 votes

Merci beaucoup ! Ça a marché comme sur des roulettes. Encore une précision. Comment exécuter une commande comme net start WinServ dans l'Inno script ?

3 votes

Vous pouvez essayer Filename: "net.exe"; Parameters: "start WinServ" . si cela ne fonctionne pas, vous pouvez simplement ajouter un commutateur supplémentaire --start à votre application c# et démarrer le service Windows directement depuis le programme en utilisant la classe ServiceController ( msdn.microsoft.com/fr/us/library/ ).

2 votes

6voto

Sarah Weinberger Points 2124

Le résultat mentionné ci-dessus est génial et résout le problème de ne pas utiliser le défunt programme d'installation de Microsoft, qui ne sera pas dans la prochaine version de Visual Studio (2012 ?) et qui avait des problèmes.

Je tiens à préciser que le code ajouté ci-dessus omet les déclarations using requises. J'ai dû faire des recherches à ce sujet. Le voici :

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;

6voto

Steven Points 361

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 " sur la façon de démarrer, d'arrêter, de vérifier l'état du service, de le supprimer, etc.

2voto

Tony Edgecombe Points 2142

Si vous voulez éviter les redémarrages lorsque l'utilisateur effectue une mise à niveau, vous devez arrêter le service avant de copier l'exe et le relancer après.

Il y a des fonctions script pour faire cela à Service - Fonctions pour démarrer, arrêter, installer, supprimer un service

0 votes

Dans votre article, les prototypes des fonctions utilisées ne sont pas traduits précisément 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.)

1voto

Preet Sangha Points 39414

Je pense que vous devez utiliser la section [Run]. Voir aquí

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X