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

92

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

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

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

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

installutil.exe /u MyService.exe

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

  • 0
    Я думаю, что вам нужно использовать раздел [Run]. Смотри здесь
Теги:
windows-services
inno-setup

4 ответа

203
Лучший ответ

Вам не нужно 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"
  • 0
    Большое спасибо! Это работало как волшебство. Еще одно уточнение. Как запустить команду типа net start WinServ в Inno Script?
  • 3
    Вы можете попробовать Filename: "net.exe"; Parameters: "start WinServ" . если это не сработает, вы можете просто добавить еще один параметр --start в ваше приложение на c # и запустить службу windows непосредственно из программы с помощью класса ServiceController ( msdn.microsoft.com/en-us/library/… ).
Показать ещё 13 комментариев
5

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

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

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

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

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

1

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

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

1

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

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

  • 0
    В вашей связанной статье прототипы используемых функций не точно переведены, и их использование также не правильно (например, не нужно ждать запуска, остановки и т. Д.).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню