Inno Setup per il servizio di Windows?

Ho un servizio di Windows .Net. Voglio creare un programma di installazione per installare quel servizio di Windows.

Fondamentalmente, deve fare quanto segue:

  1. Pack installutil.exe (è necessario?)
  2. Eseguire installutil.exe MyService.exe
  3. Avvia MyService

Inoltre, voglio fornire un programma di disinstallazione che esegua il seguente comando:

 installutil.exe /u MyService.exe 

Come fare ciò usando Inno Setup?

Non hai bisogno di installutil.exe e probabilmente non hai nemmeno i diritti per ridistribuirlo.

Ecco come lo sto facendo nella mia applicazione:

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

Fondamentalmente puoi avere il tuo servizio per installare / disinstallare da solo usando ManagedInstallerClass come mostrato nel mio esempio.

Quindi è solo questione di aggiungere al tuo script InnoSetup qualcosa del genere:

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

Ecco come l’ho fatto:

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

Apparentemente, l’installazione di Inno ha le seguenti costanti per fare riferimento alla cartella .NET sul tuo sistema:

  • {} Dotnet11
  • {} Dotnet20
  • {} Dotnet2032
  • {} Dotnet2064
  • {} Dotnet40
  • {} Dotnet4032
  • {} Dotnet4064

Maggiori informazioni disponibili qui .

Puoi usare

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

per creare un servizio. Vedere ” sc.exe ” su come avviare, arrestare, controllare lo stato del servizio, eliminare il servizio, ecc.

Se si desidera evitare il riavvio quando l’utente esegue l’aggiornamento, è necessario interrompere il servizio prima di copiare l’exe e ricominciare da capo.

Esistono alcune funzioni di script per eseguire questa operazione in Servizio: Funzioni per avviare, arrestare, installare, rimuovere un servizio