Inno Setup pour Windows service?
j'ai un service .net Windows. Je veux créer un installateur pour installer ce service windows.
fondamentalement, il doit faire ce qui suit:
- Pack
installutil.exe
(est-ce nécessaire?) - Exécuter
installutil.exe
MyService.exe - Start MyService
aussi, je veux fournir un uninaller qui exécute la commande suivante:
installutil.exe /u MyService.exe
comment utiliser Inno Setup?
4 réponses
vous n'avez pas besoin de installutil.exe
et vous n'avez probablement même pas le droit de le redistribuer.
Voici comment je le fais dans ma demande:
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 avoir votre service à installer/désinstaller sur son propre en utilisant ManagedInstallerClass
comme montré dans mon exemple.
alors 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"
Voici comment je l'ai fait:
Exec(ExpandConstant('{dotnet40}\InstallUtil.exe'), ServiceLocation, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
apparemment, Inno setup 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 .
si vous voulez éviter les redémarrages lorsque l'utilisateur met à niveau, alors vous devez arrêter le service avant de copier l'exe et recommencer après.
il y a quelques fonctions de script pour faire ceci à Service-fonctions pour démarrer, arrêter, installer, supprimer un Service
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 supprimer le service, etc.