Служба Inno для Windows?

У меня есть .Net-служба Windows. Я хочу создать установщик для установки этой службы Windows.

В основном, он должен сделать следующее:

  • Пакет installutil.exe (требуется ли?)
  • Запустить installutil.exe MyService.exe
  • Запустить MyService

Кроме того, я хочу предоставить деинсталлятор, который выполняет следующую команду:

installutil.exe /u MyService.exe

Как это сделать с помощью Inno Setup?

Ответ 1

Вам не нужно installutil.exe и, возможно, у вас даже нет прав на его распространение.

Вот как я это делаю в своем приложении:

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

В принципе, вы можете самостоятельно установить или удалить свою услугу, используя ManagedInstallerClass, как показано в моем примере.

Тогда просто нужно добавить в свой InnoSetup script что-то вроде этого:

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

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

Ответ 2

Вот как я это сделал:

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

По-видимому, Inno setup имеет следующие константы для ссылки на папку .NET в вашей системе:

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

Дополнительная информация здесь.

Ответ 4

Вы можете использовать

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

чтобы создать службу. См. " sc.exe" о том, как запустить, остановить, проверить статус службы, удалить службу и т.д.