Не так давно мне потребовалось запустить службу Windows, написанную на C#, напрямую из кода, не прибегая к использованию Installutil.exe из командной строки. После некоторых поисков, было выбрано решение, описанное под катом.
Однажды я в очередной раз листал хабр на тему отладки служб Windows, написанных на C#. Понравилась идея запускать службу в виде консольного приложения с помощью некого параметра командной строки. И тут я подумал, что неплохо было бы также управлять работой службы также через такие же параметры. К сожалению, такой информации на хабре мне найди не удалось, и я принялся штурмовать Google.
В .NET существует класс
Предположим, что если при запуске приложения с аргументом /install нужно установить службу, то код будет выглядеть следующим образом:
Тем самым служба будет установлена.
Запустить службу можно так:
Соответственно, остановить:
И, наконец, удалить:
В итоге, используя все эти конструкции, можно с помощью только одного полученного *.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 файла и набора некоторых аргументов командной строки легко управлять вариантами запуска приложения, будь то консоль или служба.