web-dev-qa-db-ja.com

Windowsサービスと通信する方法は?

データを検証して別のWindowsアプリケーションからデータにアクセスするWindowsサービスを作成したいのですが、サービスが初めてなので、開始方法がわかりません。

したがって、サービスの実行中に、Windowsアプリケーションは何らかの形でサービスに接続し、データを送信して、trueまたはfalseの応答を取得する必要があります。

32
Alexandru Pupsa

私はあなたが次のことをしているのとほぼ同じ問題をうまく処理できました:

Service Classを表すClass:ServiceBaseには、次のものがあります。

public Class () //constructor, to create your log repository
    {
      InitializeComponent();

      if (!System.Diagnostics.EventLog.SourceExists("YOURSource"))
      {
        System.Diagnostics.EventLog.CreateEventSource(
           "YOURSource", "YOURLog");
      }
      eventLog1.Source = "YOURSource";
      eventLog1.Log = "YOURLog";
    }

今、実装:

protected override void OnStart(string[] args)
{...}

そして

protected override void OnStop()
{...}

カスタムコマンド呼び出しを処理するには:

protected override void OnCustomCommand(int command)
    {
      switch (command)
      {
        case 128:
          eventLog1.WriteEntry("Command " + command + " successfully called.");
          break;
        default:
          break;
      }
    }

今、Windowsサービスを呼び出すアプリケーションでこれを使用します:

メソッドを参照する列挙型:(サービスのカスタムメソッドは常にパラメーターとしてint32(128〜255)を受け取り、列挙型を使用すると、メソッドを覚えやすく、制御しやすくなります。

private enum YourMethods
  {
    methodX = 128
  };

特定のメソッドを呼び出すには:

ServiceController sc = new ServiceController("YOURServiceName", Environment.MachineName);
ServiceControllerPermission scp = new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, Environment.MachineName, "YOURServiceName");//this will grant permission to access the Service
    scp.Assert();
    sc.Refresh();

    sc.ExecuteCommand((int)YourMethods.methodX);

これを行うと、サービスを制御できます。

ここ Windowsサービスの作成およびインストール方法を確認できます。 その他 ExecuteCommandメソッドについて。

幸運を!

33
user2750836

.Net Framework 4を使用している場合、メモリマップファイルは、クロスプロセス通信を実装するかなり簡単な方法を提供します。

それは非常にシンプルで、ドキュメントに詳しく説明されており、WCFまたは他の接続/リモートベースの対話を使用したり、共有データを中央の場所に書き込んでポーリングしたり(データベース、ファイルなど)。

概要については here をご覧ください。

4
Rob Levine

サービスをWCFサービスホストにし、アプリケーションからサービスに接続することで、これを非常に簡単に実現できます。

3
poindexter12

この目的のために名前付きパイプを使用します。しかし、クライアントはC++で実装しました。サービスとアプリケーションが.Netで実装されている場合、.Netリモーティングを使用できます。

2
DReJ

古いバージョンのWindowsでは、デスクトップと対話するようにWindowsサービスを構成できました。これにより、ユーザーに提示できるユーザーインターフェイス要素をサービスに直接追加できました。 Windows Vista以降、サービスはユーザーと直接対話できなくなりました。つまり、ユーザーインターフェイスはありません。

これを行うには、Windowsサービスを記述しますandフロントエンドWindows応用。 2つの間の通信ブリッジを提供するには、 Windows Communication Foundation (WCF)を使用することを強くお勧めします。

C#Windowsサービスを作成するには、ステップバイステップの手順 here に従うことができます。

1
Matt Davis

リモートデータベースの所有者と考えてください。データベースが1つあり、データベースとは異なるデータを必要とする10のアプリケーションがあり、各アプリケーションに対してすべてのデータを開きたくないとします。また、アプリケーションはデータベースから独立しており、データレイヤーはサービスに実装されている場合、アプリケーションはそのロジックを保持しません。サービスを記述し、他のアプリケーションに対してサービスを開くことができます。

最初のWindowsサービスの作成方法 が役立ちます。

0
Pabuc