Создайте комбинированное приложение командной строки/службы Windows.

StackOverflow https://stackoverflow.com/questions/809082

Вопрос

Каков наилучший способ на C# настроить служебное приложение, которое можно запускать из командной строки и производить некоторый вывод (или записывать в файл), но которое также можно запускать как службу Windows, чтобы выполнять свою работу в фоновом режиме? (например.мониторинг каталога или что-то еще).

Я хотел бы написать код один раз и иметь возможность вызывать его в интерактивном режиме из PowerShell или какого-либо другого интерфейса командной строки, но в то же время найти способ установить тот же EXE-файл в качестве службы Windows и запустить его без присмотра.

Я могу сделать это?И если так:Как я могу это сделать?

Это было полезно?

Решение

Да, ты можешь.

Один из способов сделать это — использовать параметр командной строки, например «/console», чтобы отличить версию консоли от версии, запускаемой как служба:

  • создайте консольное приложение Windows, а затем
  • в Program.cs, точнее в функции Main, вы можете проверить наличие параметра «/console».
  • если есть "/console", запустите программу как обычно
  • если параметр отсутствует, вызовите свой класс обслуживания из 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;лучше не пытаться делать два дела одновременно.

Рассматривали ли вы вместо этого сделать это запланированной задачей?

Служба Windows против запланированной задачи

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top