2017-01-19 5 views
1

Я знаю, что запуск процесса из приложения Windows Service невозможно (или очень сложно из-за служб Windows, работающих в изолированном процессе). Однако можно ли запустить службу Windows из метода внутри приложения WPF? Если да, то как это сделать на C#?Как запустить прикладное приложение Windows из метода приложения WPF

ответ

2

Во-первых, некоторые фон:

службы Windows (WS) представляет собой фоновый процесс, который выполняется без пользовательского интерфейса (без учета вы непослушный WS с Разрешить взаимодействие с рабочим столом галочкой) и может работать до того, как пользователь выполнил вход в систему. Из-за этого WS может работать в контексте LOCALSYSTEM; NETWORK SERVICE или даже явная учетная запись пользователя, предназначенная для службы среди других. Службы, которые начинаются с Windows во время загрузки и перед входом пользователя, известны как Автозапуск услуг. Есть даже зверь, известный как отложенный автозапуск.

Однако возможно ли запустить службу Windows из метода внутри приложения WPF?

Если «запустить» вы имеете в виду, как запускать ранее развернутый WS для запуска, тогда «Да!».

Рассмотрим пример ниже и представьте, что метод SomeMethodInMyWpfApp() существует где-то в вашем приложении WPF. Затем, просто вызвав этот метод, мы получим ссылку на служебный контроллер для WS, известный как «MissPiggyService» по имени. Когда у нас есть ссылка, мы можем запросить состояние службы. Это работает? Он находится в процессе запуска? Если ответ на оба этих вопроса «нет», мы выдаем запрос на запуск службы. Мы делаем это, потому что обычно нехорошо говорить, что SC запускает сервис, который уже находится в процессе запуска.

void SomeMethodInMyWpfApp() 
{ 

    ServiceController sc = new ServiceController("MissPiggyService"); 
    if (sc.Status != ServiceControllerStatus.Running && 
     sc.Status != ServiceControllerStatus.StartPending) 
    { 
     sc.Start(); 
    } 
} 

Однако, если по «Тем не менее, можно запустить службу Windows из метода внутри приложения WPF?» вы можете создать; реплицировать и запускать функциональные возможности внешнего WS в вашем приложении WPF - тогда нет.

WS не являются регулярными процессами. Для одного вы не можете внедрить один процесс в другой (по крайней мере, я не думаю, что вы можете, мы не говорим об AppDomains здесь), но что более важно, WS должен иметь возможность отвечать на Windows Service Controller, когда он попросит ваш WS начать, остановить и, возможно, приостановить. То, что обычный процесс не реализует.

+0

спасибо! это то, что я искал! – Nico

+0

@Nico. Добро пожаловать, сэр! :) – MickyD

 Смежные вопросы

  • Нет связанных вопросов^_^