2017-01-19 9 views
1

Windowsサービスアプリケーションからプロセスを開始することは不可能です(または、独立したプロセスで実行されているWindowsサービスのために非常に困難です)。ただし、WPFアプリケーション内のメソッドからWindowsサービスを実行することは可能ですか?もしそうなら、私はC#でそれをどうしますか?WPFアプリケーションメソッドからWindowsサービスアプリケーションを実行する方法

答えて

2

まず、いくつかの背景:

A Windowsサービス(WS)ユーザーインターフェースなしで実行するバックグラウンド・プロセスである(とあなたいたずらWSを無視して、サービスが刻まデスクトップと対話することを可能にする)と、実行することができますユーザーがログインする前に実行されます。このため、WSはというコンテキストで実行される可能性があります。LOCALSYSTEM; ネットワークサービス、または他のサービスの間でサービス専用の明示的なユーザーアカウントでもあります。起動時およびユーザがログインする前にWindowsで起動するサービスは、自動起動サービスと呼ばれます。 遅れたオートスタートとして知られているbeastieさえあります。

ただし、WPFアプリケーション内のメソッドからWindowsサービスを実行できますか?

「実行」とは、以前に展開したWSを起動して「はい」をトリガーする方法を意味します。

以下の例を考えて、SomeMethodInMyWpfApp()というメソッドがあなたのWPFアプリケーションのどこかに存在すると想像してください。次に、このメソッドを呼び出すだけで、"MissPiggyService"というWSのサービスコントローラーへの参照が取得されます。参照を取得したら、サービスの状態を問い合わせることができます。それは実行されていますか?それは開始の過程にありますか?両方の質問に対する回答が「いいえ」の場合、サービス開始要求が発行されます。すでに開始しているサービスを開始するようSCに伝えるのは一般的ではないので、これを行います。 による場合

void SomeMethodInMyWpfApp() 
{ 

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

しかし、「しかし、WPFアプリケーションの内部メソッドからWindowsサービスを実行することが可能です?」作成できます。 WPFアプリケーション内で外部WSの機能を複製して実行します。

WSは通常のプロセスではありません。 1つのプロセスを別のプロセスに埋め込むことはできません(少なくとも私はできないと思いますが、ここではAppDomainsについては言及していません)。さらに重要なことに、WSはWindows Service Controllerに応答できる必要がありますあなたのWSに開始、停止、および一時停止を要求します。通常のプロセスが実装していないもの。

+0

ありがとう!それは私が探していたものでした! – Nico

+0

@Nicoあなたは大歓迎です! :) – MickyD

関連する問題