42

次のリンクのように、C#コードを使用して、サービスを停止、開始、および「停止してから開始」することができます。

http://www.csharp-examples.net/restart-windows-service/

OnStartとを実装する.NETサービスをベイクしましたOnStop。ただし、単に停止してから開始するよりも複雑な「スマートリスタート」機能を実装する必要があります。その場合、ダウンタイムをわずか数秒に保つ必要があります(ただし、この場合、停止と開始はクリーンに実行すると数分かかる可能性があり、クリーンに実行する必要があります)。また、システムの一部を使用可能にして、他の部分を再起動/更新します。 。

簡単に言うと、この機能の実装に取り​​掛かる前にOnSmartRestart、別のC#アプリケーションからこの呼び出しを呼び出す非常に簡単な方法があることを確認したいと思います。

この機能は重要ですが、危険です。かなり隠し、ある程度安全にし、シンプルに保ち、Windowsサービスが通常の雑用を実行し、再起動しない間、これがWindowsサービスのパフォーマンスに与える影響を無視できるようにします。

いくつかのファイルをポーリングするか、ポートを開いて、それを行うためにCPUを使いすぎる必要がある場合、それは良い解決策ではありません。また、これを可能な限りシンプルに保ちたいと思います(繰り返して申し訳ありません)。

4

2 に答える 2

64

ServiceController.ExecuteCommandを使用して、サービスに「コマンド」を送信できます。

const int SmartRestart = 222;

var service = new System.ServiceProcess.ServiceController("MyService");
service.ExecuteCommand(SmartRestart);
service.WaitForStatus(ServiceControllerStatus.Running, timeout);

System.ServiceProcess.dllアセンブリへの参照を追加する必要があります。

サービスは、 ServiceBase.OnCustomCommandをオーバーライドすることでコマンドに反応できます。

protected override void OnCustomCommand(int command)
{
    if (command == SmartRestart)
    {
        // ...
    }
}
于 2010-09-12T14:56:46.800 に答える
17

Windowsで外部プロセスと通信する通常の手段は次のとおりです。

  1. 名前付きパイプ
  2. ソケット
  3. COMのGetObjectを使用してオブジェクトへの参照を取得し、公開されたインターフェイスを介してそのメソッドを呼び出します。

最初の2つはWCFとして公開されているので、それが進むべき道です。3つ目は、あなたの状況とは関係がないようで、古いものです。

同じマシンからコマンドを実行する必要がある場合は、名前付きパイプを使用できますが、硬化により非常に困難で面倒です。それ以外の場合は、WCFのTCP名前付きバインディングを使用します。

于 2010-09-12T15:00:49.743 に答える