Добавление консоли через логику программы - PullRequest
3 голосов
/ 25 января 2012

У меня есть служба Windows. Если я запускаю его из отладчика, я хочу запустить с выводом на консоль (поскольку вы не можете запустить службу).

Обычно служба Windows устанавливается в WindowApplication в качестве типа проекта и не имеет точки входа в окно. Таким образом он удаляет старую добрую консоль.

Если вам нужно консольное окно, вам нужно изменить тип проекта на ConsoleAppication. Я хотел бы сделать это в самой программе, вместо этого изменив настройки проекта.

Возможно ли это?

Ответы [ 5 ]

2 голосов
/ 25 января 2012

На самом деле вы можете использовать простую проверку, когда программа начинает видеть, работает ли она как служба или нет, а затем использовать команду AllocConsole, чтобы запустить консоль.Вот пример кода.

namespace TestService 
{
   static class Program
   {
        [DllImport("kernel32.dll")]
        static extern bool AllocConsole();

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            if (!Environment.UserInteractive)                                
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] 
                { 
                    new Service1() 
                };
                ServiceBase.Run(ServicesToRun);
            }
            else 
            {
                AllocConsole();
                //Start Code that interfaces with console.
            }           
         }        
     }
 }
2 голосов
/ 25 января 2012

Вы можете использовать AllocConsole API

[DllImport("kernel32.dll")]
static extern bool AllocConsole();

Используйте FreeConsole для отсоединения консоли от процесса:

[DllImport("kernel32.dll")]
static extern bool FreeConsole();
1 голос
/ 25 января 2012

Обычно я разрабатываю любую программу в виде библиотеки классов (или набора библиотек) с логической точкой входа, затем добавляю оболочку проекта запуска: консольное приложение, службу Windows, веб-сайт.

Если в вашей программе есть точка входа (класс с методом, который запускает всю вашу бизнес-логику), то вы можете создать ее как библиотеку классов без каких-либо изменений и добавить консольный проект и проект службы Windows в свойрешение, которое в основном классе (например, Program.cs) создает точку входа и вызывает метод ввода.

Этот подход не вторгается в вашу бизнес-логику с использованием подхода использования и позволяет вам каждый раз создавать каждый режим использованияВы строите все решение.Другими словами, это позволяет разделить проблемы: программу и способ ее запуска.

0 голосов
/ 25 января 2012

Да, вы можете сделать это несколькими способами. Я использую следующее решение:

  1. Создать проект консольного приложения. Назовите это Console.Service или что-то еще.

  2. Перейдите в класс обслуживания и создайте следующий код:

    private static void Main()
    {            
        #if !DEBUG
        var servicesToRun = new [] { new DemoService() };
    
        Debug.WriteLine("Run service...");
        Run(servicesToRun);      
        #else
        DemoService service = new DemoService();
    
        service.OnStart(null);
    
        Console.WriteLine("Press ENTER to quit...");
        Console.ReadLine();
    
        service.OnStop();
    
        #endif
    }
    
  3. Добавьте существующий элемент в проект консольного приложения, связавшись с классом Service из вашего проекта службы. Это можно сделать, нажав на стрелку рядом с кнопкой добавления (Добавить как ссылку).

Вы сделали. Как я уже сказал, есть несколько способов пойти. Выберите тот, который вам нравится больше всего.

0 голосов
/ 25 января 2012

Хорошей практикой является наличие двух программ (то есть двух проектов в Visual Studio, создающих исполняемые файлы, плюс один или несколько проектов для общей логики приложения):

  1. Одна для варианта программного обеспечения Windows Service вашего программного обеспечения;
  2. Еще один вариант консольного варианта вашего программного обеспечения.

Преимущество заключается в том, что вы можете свободно выбирать, запускать программное обеспечение в качестве службы или в режиме консоли.Например, при работе в режиме консоли с такими платформами, как Log4Net, вы можете настроить вывод журнала в консоль, что помогает в диагностике проблем в производственных средах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...