У меня есть .Net-служба Windows. Я хочу создать установщик для установки этой службы Windows.
В основном, он должен сделать следующее:
installutil.exe
(требуется ли?)installutil.exe
MyService.exeКроме того, я хочу предоставить деинсталлятор, который выполняет следующую команду:
installutil.exe /u MyService.exe
Как это сделать с помощью Inno Setup?
Вам не нужно 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"
Filename: "net.exe"; Parameters: "start WinServ"
. если это не сработает, вы можете просто добавить еще один параметр --start в ваше приложение на c # и запустить службу windows непосредственно из программы с помощью класса ServiceController ( msdn.microsoft.com/en-us/library/… ).
Вот как я это сделал:
Exec(ExpandConstant('{dotnet40}\InstallUtil.exe'), ServiceLocation, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
По-видимому, Inno setup имеет следующие константы для ссылки на папку .NET в вашей системе:
Дополнительная информация здесь.
Вы можете использовать
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" о том, как запустить, остановить, проверить статус службы, удалить службу и т.д.
Если вы хотите избежать перезагрузки, когда пользователь обновляется, вам необходимо остановить службу перед копированием exe и начать снова после.
Есть несколько функций script для этого в Сервис - функции запуска, остановки, установки, удаления службы