Создайте комбинированную командную строку / приложение-службу Windows
Каков наилучший способ в C# настроить служебное приложение, которое можно запускать из командной строки и производить какой-то вывод (или запись в файл), но его также можно запускать как службу Windows, чтобы выполнять свою работу в фоновом режиме (например, мониторинг каталога или что-то еще).
Я хотел бы написать код один раз и иметь возможность интерактивно вызывать его из PowerShell или другого CLI, но в то же время найти способ установить тот же EXE-файл, что и служба Windows, и запустить его без присмотра.
Я могу это сделать? И если так: как я могу это сделать?
4 ответа
Да, ты можешь.
Один из способов сделать это - использовать параметр командной строки, скажем, "/console", чтобы отличать версию консоли от версии "запуск как служба":
- создать консольное приложение Windows, а затем
- в Program.cs, точнее в функции Main, вы можете проверить наличие параметра "/ console"
- если есть "/console", запустите программу как обычно
- если param отсутствует, вызовите ваш класс Service из ServiceBase
// Class that represents the Service version of your app
public class serviceSample : ServiceBase
{
protected override void OnStart(string[] args)
{
// Run the service version here
// NOTE: If you're task is long running as is with most
// services you should be invoking it on Worker Thread
// !!! don't take too long in this function !!!
base.OnStart(args);
}
protected override void OnStop()
{
// stop service code goes here
base.OnStop();
}
}
...
Затем в Program.cs:
static class Program
{
// The main entry point for the application.
static void Main(string[] args)
{
ServiceBase[] ServicesToRun;
if ((args.Length > 0) && (args[0] == "/console"))
{
// Run the console version here
}
else
{
ServicesToRun = new ServiceBase[] { new serviceSample () };
ServiceBase.Run(ServicesToRun);
}
}
}
Лучший способ сделать это с точки зрения дизайна - реализовать все свои функциональные возможности в библиотечном проекте и создать вокруг него отдельные проекты-оболочки, чтобы выполнять их так, как вам нужно (например, служба Windows, программа командной строки, веб-служба asp.net). сервис wcf и т. д.)
Да, это может быть сделано.
Ваш класс запуска должен расширять ServiceBase.
Вы можете использовать ваш метод запуска static void Main(string[] args) для разбора ключа командной строки для запуска в режиме консоли.
Что-то вроде:
static void Main(string[] args)
{
if ( args == "blah")
{
MyService();
}
else
{
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyService() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
Служба Windows сильно отличается от обычной программы Windows; вам лучше не пытаться делать две вещи одновременно.
Рассматривали ли вы сделать это запланированной задачей вместо этого?