Как я могу создать приложение Windows, которое может работать с графическим интерфейсом * или * как служба Windows в C #? - PullRequest
1 голос
/ 20 февраля 2009

Я хотел бы создать приложение, используя C #, ...:

  • Может быть запущен как приложение Windows, с графическим интерфейсом (он будет отображать прогресс, состояние и т. Д.)

    OR

  • Может быть запущен как служба Windows, без графического интерфейса пользователя

Возможно ли это? Кто-нибудь может заставить меня начать?

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

В этом случае ... как я могу получить данные из службы Windows из моего приложения с графическим интерфейсом?

Ответы [ 5 ]

6 голосов
/ 20 февраля 2009

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

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

Код "форма или служба" выглядит примерно так:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    private static void Main(string[] args)
    {
        if (args.Length > 0 && args[0] == "/form")
        {
            var form = new MainForm();
            Application.Run(form);
            return;
        }

        var ServicesToRun = new ServiceBase[]
            {
                new BackgroundService()
            };

        ServiceBase.Run(ServicesToRun);
    }
}
2 голосов
/ 20 февраля 2009

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

Хотя это может звучать вменяемым, вы будете удивлены, как много приложений нуждаются в полной перезаписи, чтобы стать другим типом интерфейса пользователя. Спасибо за вопрос. Это убеждает меня в том, что мне нужна книга, которую я пишу. : -)

2 голосов
/ 20 февраля 2009

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

Обычно мы просто используем флаг компилятора для переключения между ними. Вот пример ... Я не совсем продумал это, но это может дать вам начало:

#define RUN_AS_SERVICE

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.ServiceProcess;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
#if RUN_AS_SERVICE

            System.ServiceProcess.ServiceBase[] ServicesToRun;
            ServicesToRun = new System.ServiceProcess.ServiceBase[]
            {
                new MyService()
            };
            System.ServiceProcess.ServiceBase.Run(ServicesToRun);
#else
            // Run as GUI
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
#endif
        }
    }
    public class MyService : ServiceBase
    {
        protected override void OnStart(string[] args)
        {
            // Start your service
        }

        protected override void OnStop()
        {
            // Stop your service
        }
    }
}
1 голос
/ 20 февраля 2009

Вы должны пойти с последним вариантом. Создайте свой сервис, а затем отдельное приложение с графическим интерфейсом. Большая часть сантехники для всего этого уже предоставлена ​​вам в рамках. Посмотрите на класс ServiceController.

0 голосов
/ 20 февраля 2009

Я видел эту ветку, она может иметь больше информации для вас

Как написать службу c #, которую я также могу запускать как программу winforms?

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