Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Да, вы можете.

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

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

}

код >

Ответ 2

Лучший способ добиться этого с точки зрения дизайна - реализовать всю вашу функциональность в проекте библиотеки и создать вокруг него отдельные проекты-оболочки, чтобы выполнить то, что вы хотите (например, служба Windows, программа командной строки, asp. сетевой веб-сервис, wcf-сервис и т.д.)

Ответ 3

Да, это можно сделать.

Ваш класс запуска должен расширять ServiceBase.

Вы можете использовать метод статического 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);
   }

Ответ 4

Служба Windows сильно отличается от обычной программы Windows; вам лучше не пытаться делать сразу две вещи.

Считаете ли вы, что это запланированная задача?

служба Windows и запланированная задача