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


105

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

По сути, он должен делать следующее:

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

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

installutil.exe /u MyService.exe

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


Думаю, вам нужно использовать раздел [Выполнить]. Смотрите здесь
Preet Sangha

Ответы:


233

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

3
можешь попробовать Filename: "net.exe"; Parameters: "start WinServ". если это не сработает, вы можете просто добавить еще один переключатель - start в свое приложение C # и запустить службу Windows непосредственно из программы, используя класс ServiceController ( msdn.microsoft.com/en-us/library/… ).
lubos hasko


7
Для C # неофита (как я), вам необходимо либо добавить using System.Reflection;или изменения Assemblyк System.Reflection.Assemblyв коде выше.
rlandster

1
InstallUtil является частью dot net framework, вам не нужны «права» для его распространения, он уже присутствует в вашей целевой системе (конечно, при условии, что вы можете запустить свое приложение)
Андрей Савиных,

10
Из документации о методе InstallHelper в 4.5 - «Этот API поддерживает инфраструктуру .NET Framework и не предназначен для использования непосредственно из вашего кода». Обнаружен после получения System.InvalidOperationException.
Bratch

8

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

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

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

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

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


5

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

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

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

Для этого в Сервисе есть несколько скриптовых функций - Функции для запуска, остановки, установки, удаления службы.


В вашей связанной статье прототипы используемых функций не переведены точно, и их использование также некорректно (например, нет ожидания запуска, остановки службы и т. Д.).
TLama
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.