Запуск службы Windows из кода при помощи ManagedInstallerClass

Не так давно мне потребовалось запустить службу Windows, написанную на C#, напрямую из кода, не прибегая к использованию Installutil.exe из командной строки. После некоторых поисков, было выбрано решение, описанное под катом.

Однажды я в очередной раз листал хабр на тему отладки служб Windows, написанных на C#. Понравилась идея запускать службу в виде консольного приложения с помощью некого параметра командной строки. И тут я подумал, что неплохо было бы также управлять работой службы также через такие же параметры. К сожалению, такой информации на хабре мне найди не удалось, и я принялся штурмовать Google.

В .NET существует класс ManagedInstallerClass. Microsoft не советует вызывать его непосредственно из кода, но, как известно, если очень хочется — то можно. У этого класса есть метод IstallHelper. Вот он то нам и нужен.

Предположим, что если при запуске приложения с аргументом /install нужно установить службу, то код будет выглядеть следующим образом:
if (ContainArg("/install"))
{
    ManagedInstallerClass.InstallHelper(new[] { Assembly.GetExecutingAssembly().Location });
}

Тем самым служба будет установлена.
Запустить службу можно так:
if (ContainArg("/install"))
{
     ServiceController controller = new ServiceController("MyServiceName");
     controller.Start();
}

Соответственно, остановить:
controller.Stop();

И, наконец, удалить:
ManagedInstallerClass.InstallHelper(new[] { "/u", Assembly.GetExecutingAssembly().Location }); 

В итоге, используя все эти конструкции, можно с помощью только одного полученного *.exe файла и набора некоторых аргументов командной строки легко управлять вариантами запуска приложения, будь то консоль или служба.
Теги:
службы windows, c#, MahagedInstallerClass

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.