Запуск приложения WPF как Службы Windows

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

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

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

с нетерпением жду интересный :-)

6 ответов


как правило, службы thumb никогда не должны иметь никакого пользовательского интерфейса. Это связано с тем, что службы обычно работают с очень высокими привилегиями, и плохие вещи могут произойти, если вы не очень осторожны со своими входами. (Я думаю, что новейшие версии 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, чтобы закрыть.


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


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

может быть, это поможет кому-то.


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

myapp.exe --runservice

зацени. Это делает любой исполняемый файл запускаться как служба.

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

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


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

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

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

мы можем настроить объект запуска в Visual Studio - > свойство проекта - > приложение - > объект запуска.

таким образом, установив запись и перестроить, u получит то, что вы хотите.