Службы Windows для консольного приложения в C # .net - PullRequest
0 голосов
/ 09 февраля 2012

Я сделал одно консольное приложение для уведомления по электронной почте в c #. Могу ли я преобразовать это консольное приложение в службу Windows?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 09 февраля 2012

В visual studio создайте проект «Служба Windows» вместо «Консольное приложение».Посмотрите на код, который генерируется для вас.Будет метод OnStart () и OnStop ().Это методы, которые будут вызываться при запуске и остановке вашей службы.Поместите свой код в эти методы, и у вас будет служба Windows.

1 голос
/ 09 февраля 2012

Вопреки некоторым предложениям, высказанным другими ответами, вы, вероятно, не можете делать то, что хотите, с помощью службы Windows. Он не может отображать ожидаемое «уведомление», потому что службы не могут отображать какой-либо пользовательский интерфейс.

Подходящим решением является создание обычного приложения, которое работает в фоновом режиме, не показывая никаких окон. Вы не можете сделать это с консольным приложением (ну, вы можете , но давайте не будем слишком усложнять), потому что каждый раз, когда вы его запускаете, будет отображаться окно консоли. Но если вы создадите стандартное приложение Windows (приложение Windows Forms или WPF), то просто не создавайте окно, все будет хорошо.

Возможно, вы захотите создать и поместить значок в область уведомлений панели задач, которая будет обрабатывать отображение уведомления по прибытии электронной почты. Если вы создаете приложение WinForms, это можно легко сделать с помощью компонента NotifyIcon .

Что-то вроде (предупреждение, написанное без помощи компилятора!):

static class Program
{
   [STAThread]
   static void Main()
   {
      // Standard infrastructure code
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);

      // Create a context menu and add item(s) to it
      ContextMenu mnu = new ContextMenu();
      MenuItem mnuExit = new MenuItem("E&xit");
      mnu.MenuItems.Add(mnuExit);
      mnuExit.Click += mnuExit_Click);

      // Create the NotifyIcon
      NotifyIcon ni = new NotifyIcon();
      ni.Icon = new Icon(GetType(), "icon.ico");
      ni.Text = "Email Notifier";
      ni.ContextMenu = mnu;
      ni.Visible = true;

      // Run the application
      Application.Run();

      // Before exiting, remove the NotifyIcon from the taskbar
      ni.Visible = false;
   }

   private static void mnuExit_Click(object Sender, EventArgs e)
   {
      Application.Exit();
   }
}
0 голосов
/ 09 февраля 2012

Когда я делаю это, я пишу приложение в классе, который не считает себя консольным приложением. Я имею в виду, что я не пишу в Консоль. Я использую log4net, чтобы записать все в ... просто войти в Info. Используйте консольное приложение для вызова класса приложения, и в app.config у вас может быть приложение для ведения журнала консоли ... так что вы получите вывод консоли. В службе Windows это будет просто записывать в файл или не записывать его вообще для ведения журнала на уровне Info. Важно отметить различия между консольным приложением и службой ... служба не является интерактивной, и вы не можете ничего вводить, поэтому ваше приложение должно учитывать это. Для службы Windows используйте тот же класс, но используйте проект службы Windows, чтобы запустить его.

ApplicationLogic: есть вся логика для запуска приложения. Может принимать аргументы, чтобы приложение работало так, как нужно, но не взаимодействует с консолью (может, но это будет плохой дизайн). Пишет все в лог (возможно log4net).

ConsoleApp: Обертка вокруг ApplicationLogic, которая может запрашивать у пользователя все, что ему нужно, может запрашивать ввод и отправлять его в ApplicationLogic. Имеет консольный приложение log4net, если вам нужно увидеть вывод ApplicationLogic.

WindowsService: это оболочка вокруг ApplicationLogic. Имеет предопределенную логику, чтобы поддерживать цикл и запускать логику приложения. Журналы в файл, без вывода на консоль.

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