Pull to refresh

Запуск службы 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 файла и набора некоторых аргументов командной строки легко управлять вариантами запуска приложения, будь то консоль или служба.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.