Serviço Inno Setup para Windows?

105

Eu tenho um serviço .Net Windows. Quero criar um instalador para instalar esse serviço do Windows.

Basicamente, ele deve fazer o seguinte:

  1. Pacote installutil.exe(é necessário?)
  2. Execute installutil.exeMyService.exe
  3. Iniciar MyService

Além disso, desejo fornecer um desinstalador que execute o seguinte comando:

installutil.exe /u MyService.exe

Como fazer isso usando o Inno Setup?

Devnull
fonte
Acho que você precisa usar a seção [Executar]. Veja aqui
Preet Sangha de

Respostas:

233

Você não precisa installutil.exee provavelmente nem tem direitos para redistribuí-lo.

É assim que faço em meu aplicativo:

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

Basicamente, você pode ter seu serviço para instalar / desinstalar por conta própria, usando ManagedInstallerClasscomo mostrado no meu exemplo.

Então é apenas uma questão de adicionar ao seu script InnoSetup algo assim:

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

[UninstallRun]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--uninstall"
lubos hasko
fonte
3
você pode tentar Filename: "net.exe"; Parameters: "start WinServ". se não funcionar, você pode apenas adicionar mais uma opção --start ao seu aplicativo c # e iniciar o serviço do Windows diretamente do programa usando a classe ServiceController ( msdn.microsoft.com/en-us/library/… ).
lubos hasko de
2
+1 Legal. Veja também stackoverflow.com/questions/255056/…
Ruben Bartelink
7
Para o C # neófito (como eu), você quer necessidade de adicionar um using System.Reflection;ou mudança Assemblypara System.Reflection.Assemblyno código acima.
rlandster,
1
InstallUtil é uma parte do dot net framework, você não precisa de "direitos" para redistribuí-lo, ele já está presente em seu sistema de destino (assumindo que você pode executar seu aplicativo em primeiro lugar, é claro)
Andrew Savinykh
10
Da documentação sobre o método InstallHelper em 4.5 - "Esta API oferece suporte à infraestrutura .NET Framework e não se destina a ser usada diretamente em seu código." Descoberto após receber System.InvalidOperationException.
Bratch
8

Veja como eu fiz:

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

Aparentemente, a instalação do Inno tem as seguintes constantes para fazer referência à pasta .NET em seu sistema:

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

Mais informações disponíveis aqui .

Breez
fonte
5

Você pode usar

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

para criar um serviço. Consulte " sc.exe " para saber como iniciar, parar, verificar o status do serviço, excluir o serviço, etc.

Steven
fonte
2

Se você deseja evitar reinicializações quando o usuário atualiza, você precisa interromper o serviço antes de copiar o exe e começar novamente depois.

Existem algumas funções de script para fazer isso em Serviço - Funções para iniciar, parar, instalar, remover um serviço

Tony Edgecombe
fonte
Em seu artigo vinculado, os protótipos das funções usadas não são traduzidos com precisão e seu uso também não é correto (por exemplo, não há espera para o serviço iniciar, parar etc.).
TLama