Налаштування Inno для служби Windows?


105

У мене є служба Windows .Net. Я хочу створити інсталятор для встановлення цієї служби Windows.

В основному, він повинен робити наступне:

  1. Пакет installutil.exe(це потрібно?)
  2. Запустіть installutil.exeMyService.exe
  3. Запустіть MyService

Також я хочу надати деінсталятор, який виконує таку команду:

installutil.exe /u MyService.exe

Як це зробити за допомогою програми Inno Setup?


Я думаю, вам потрібно скористатися розділом [Виконати]. Дивіться тут
Преет Сангха

Відповіді:


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

2
+1 Приємно. Дивіться також stackoverflow.com/questions/255056 / ...
Рубен Bartelink

7
Для неофіта C # (як я) вам потрібно або додати код, using System.Reflection;або змінити Assemblyйого System.Reflection.Assemblyу наведеному вище коді.
rlandster

1
InstallUtil є частиною точкової мережі, вам не потрібні "права" для їх перерозподілу, вона вже присутня у вашій цільовій системі (якщо ви, звичайно, можете запустити додаток, звичайно)
Андрій Савіних

10
З документації про метод InstallHelper в 4.5 - "Цей API підтримує інфраструктуру .NET Framework і не призначений для використання безпосередньо з вашого коду." Виявлено після отримання System.InvalidOperationException.
Братч

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.