Inno Setup для службы Windows? - PullRequest
       25

Inno Setup для службы Windows?

99 голосов
/ 20 сентября 2009

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

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

  1. Пакет installutil.exe (Требуется?)
  2. Выполнить installutil.exe MyService.exe
  3. Запустить MyService

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

installutil.exe /u MyService.exe

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

Ответы [ 4 ]

221 голосов
/ 20 сентября 2009

Вам не нужно 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 что-то вроде этого:

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

[UninstallRun]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--uninstall"
7 голосов
/ 16 октября 2014

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

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

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

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

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

3 голосов
/ 15 августа 2010

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

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 " о том, как запустить, остановить, проверить состояние службы, удалить службу и т. Д.

2 голосов
/ 23 декабря 2009

Если вы хотите избежать перезагрузок при обновлении пользователя, вам необходимо остановить службу перед копированием exe и начать снова после.

Существуют некоторые функции сценария, позволяющие сделать это в Сервис - Функции для запуска, остановки, установки, удаления службы

...