web-dev-qa-db-fra.com

Service Inno Setup pour Windows?

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

Fondamentalement, il doit faire ce qui suit:

  1. Pack installutil.exe (Est-ce obligatoire?)
  2. Courir installutil.exe MyService.exe
  3. Démarrez MyService

Je souhaite également fournir un programme de désinstallation qui exécute la commande suivante:

installutil.exe /u MyService.exe

Comment faire cela en utilisant Inno Setup?

102
devnull

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

Voici la façon dont 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 faire installer/désinstaller votre service par lui-même en utilisant ManagedInstallerClass comme indiqué dans mon exemple.

Il suffit ensuite d'ajouter à votre script InnoSetup quelque chose comme ceci:

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

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

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 .

7
breez

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.

3
Steven

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 ce faire à Service - Fonctions pour démarrer, arrêter, installer, supprimer un service

2
Tony Edgecombe