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


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

в принципе, он должен сделать следующее:

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

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

installutil.exe /u MyService.exe

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

4 99

4 ответа:

не нужно 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"

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

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

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

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

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

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

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

можно использовать

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