Запуск приложения 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 получит то, что вы хотите.