Запустите приложение WPF в качестве службы Windows - PullRequest
10 голосов
/ 17 сентября 2010

Мы разрабатываем приложение Windows Presentation Foundation, которое мы хотели бы иметь в качестве службы Windows.

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

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

С нетерпением жду интересного ввода: -)

Ответы [ 6 ]

14 голосов
/ 17 сентября 2010

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

Если вам необходимо связаться со службой, вам следует использовать некоторую формуIPC (WCF, трубы, розетки, ...).Если вы хотите простую консольную программу, которая также может быть службой, я знаю хитрость для ее установки:

class MyExampleApp : ServiceBase
{
    public static void Main(string[] args)
    {
        if (args.Length == 1 && args[0].Equals("--console"))
        {
            new MyExampleApp().ConsoleRun();
        }
        else
        {
            ServiceBase.Run(new MyExampleApp());
        }
    }
    private void ConsoleRun()
    {
        Console.WriteLine(string.Format("{0}::starting...", GetType().FullName));

        OnStart(null);

        Console.WriteLine(string.Format("{0}::ready (ENTER to exit)", GetType().FullName));
        Console.ReadLine();

        OnStop();

        Console.WriteLine(string.Format("{0}::stopped", GetType().FullName));
    }
    //snip
}

Если вы просто запустите программу, она запустится как служба (и выЕсли вы запустите его из консоли), но если вы добавите параметр --console при запуске, программа запустится и будет ждать, пока вы нажмете Enter, чтобы закрыть.

4 голосов
/ 29 ноября 2011

Мы на самом деле разработали это и написали небольшой пост об этом:
http://remy.supertext.ch/2011/11/a-wpf-project-running-from-the-cmd-prompt-or-as-a-service-and-has-a-gui/

Может быть, это кому-нибудь поможет.

3 голосов
/ 17 сентября 2010

Не делай этого. Напишите все смелости в сборке двигателя, а затем сослаться на него из графического интерфейса и службы. CLI может быть третьим исполняемым файлом или повторным использованием исполняемого файла службы. Ключ заключается в том, чтобы позволить службе работать без каких-либо ссылок на WPF или WinForms или любой другой графический интерфейс, который вы используете.

0 голосов
/ 25 декабря 2014

Мое решение - добавить функцию ввода Main, например:

public static void Main()
{
    ServiceBase.Run(new MyService());
}

Теперь у нас есть две записи запуска приложения - одна для WPF и одна для службы Windows.

Мы можем настроить объект запуска в Visual Studio, щелкнув правой кнопкой мыши по проекту и выбрав Properties -> Application -> Startup object.

Установка входа и перестройка даст вам то, что вы хотите.

0 голосов
/ 17 сентября 2010

Проверьте это.Это позволяет запускать любой исполняемый файл как службу.

Английский: http://support.microsoft.com/?scid=kb;en-us;137890&x=7&y=13

Французский: http://support.microsoft.com/kb/137890

0 голосов
/ 17 сентября 2010

Если у вас это уже работает из командной строки, вы на полпути. Некоторые приложения просто имеют простые обозначения флагов, которые вы используете, когда хотите запустить приложение в качестве службы, проверьте эти флаги и соответственно измените свой логический поток. Что-то вроде:

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