it-swarm.com.de

Wie kommuniziere ich mit einem Windows-Dienst?

Ich möchte einen Windows-Dienst erstellen, der Daten überprüft und von einer anderen Windows-Anwendung darauf zugreift, aber ich bin neu bei Diensten und weiß nicht, wie ich damit anfangen soll. 

Während der Dienst ausgeführt wird, sollte sich eine Windows-Anwendung irgendwie mit dem Dienst verbinden, Daten senden und eine Antwort erhalten, wahr oder falsch.

30
Alexandru Pupsa

Überprüfen Sie das IPC - Tag (Kommunikation zwischen Prozessen) auf StackOverflow . Dafür gibt es verschiedene Möglichkeiten und Technologien: Windows-Nachrichten, Sockets, MMF- und Synchronisationsobjekte, Named Pipes, Mail-Slots usw. 

Als eine der einfachsten Methoden für diese spezielle Aufgabe haben wir unser Produkt CBFS IPC erstellt, das mit dem Quellcode geliefert wird. 

Ich könnte das (fast) gleiche Problem erfolgreich behandeln, indem Sie Folgendes tun:

In Ihrer Klasse: ServiceBase, die Ihre Service-Klasse darstellt, haben Sie möglicherweise Folgendes:

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";
    }

Jetzt implementieren:

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

UND

protected override void OnStop()
{...}

Um benutzerdefinierte Befehlsaufrufe zu behandeln:

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

Verwenden Sie dies nun in der Anwendung, in der Sie den Windows-Dienst aufrufen.

Enum zum Verweisen auf Ihre Methoden: (Denken Sie daran, dass benutzerdefinierte Methoden von Services immer ein int32 (128 bis 255) als Parameter erhalten. Mit Enum können Sie Ihre Methoden leichter merken und steuern

private enum YourMethods
  {
    methodX = 128
  };

So rufen Sie eine bestimmte Methode auf:

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);

Dadurch können Sie Ihren Dienst steuern.

Hier können Sie prüfen, wie ein Windows-Dienst erstellt und installiert wird Weitere über die ExecuteCommand-Methode.

Viel Glück!

28
user2750836

Wenn Sie .Net Framework 4 verwenden, bieten speicherzugeordnete Dateien eine relativ einfache Möglichkeit, prozessübergreifende Kommunikation zu implementieren.

Es ist ziemlich einfach und in der Dokumentation gut beschrieben und vermeidet den Aufwand (zur Laufzeit, aber auch im Hinblick auf den Entwicklungsaufwand) der Verwendung von WCF- oder anderen auf Verbindung/Remoting basierenden Interaktionen oder des Schreibens gemeinsamer Daten an einen zentralen Ort und Abfragen (Datenbank) Datei usw.).

hier für eine Übersicht.

4
Rob Levine

Sie können dies sehr leicht erreichen, indem Sie den Dienst Host als WCF-Dienst einrichten und von Ihrer Anwendung aus eine Verbindung herstellen.

3
poindexter12

Zu diesem Zweck verwenden wir Named Pipes. Aber unser Client wurde mit C++ implementiert. Wenn Ihr Dienst und Ihre Anwendung in .Net implementiert sind, können Sie .Net-Remoting verwenden.

2
DReJ

In älteren Windows-Versionen können Sie Ihren Windows-Dienst für die Interaktion mit dem Desktop konfigurieren. Auf diese Weise können Sie Benutzeroberflächenelemente direkt zu Ihrem Dienst hinzufügen, die dem Benutzer angezeigt werden können. Ab Windows Vista können Dienste nicht mehr direkt mit Benutzern interagieren, d. H. Keine Benutzeroberflächen.

Dazu schreiben Sie Ihren Windows-Dienst und, eine Front-End-Windows-Anwendung. Um die Kommunikationsbrücke zwischen den beiden bereitzustellen, würde ich dringend empfehlen, Windows Communication Foundation (WCF) zu verwenden.

Um einen C # Windows-Dienst zu erstellen, können Sie den schrittweisen Anweisungen hier folgen.

1
Matt Davis

Ihr Service kann während der Verarbeitung Ereignisse zum EventLog hinzufügen. 

Sie können eine andere Konsolenanwendung erstellen, die parallel zum Dienst ausgeführt wird und das Ereignisprotokoll mit dem Ereignisbehandlungsmechanismus überwacht:

var log= new EventLog("[name of the eventlog]");
log.EnableRaisingEvents = true;
log.EntryWritten += Log_EntryWritten;

Dann handhaben Sie es sofort: 

private static void Log_EntryWritten(object sender, System.Diagnostics.EntryWrittenEventArgs e)
{
    Console.WriteLine("Event detected !");
}

Sie können das EntryWrittenEventArgs-Objekt lesen, um alle Ereignisdetails abzurufen und anzuzeigen, was Sie in Ihrer Konsolen-App wünschen. Wenn Sie die Konsolen-App stoppen, wird der Dienst weiterhin ausgeführt und protokolliert weiterhin im Ereignisprotokoll.

0
Allie

Halten Sie es für einen Remote-Datenbankbesitzer. Angenommen, Sie haben 1 Datenbank, aber 10 Anwendungen, für die unterschiedliche Daten aus der Datenbank erforderlich sind, und Sie möchten nicht alle Daten für jede der Anwendungen öffnen. Außerdem werden Ihre Anwendungen unabhängig von Ihrer Datenbank sein In Ihrem Dienst implementiert, werden Ihre Anwendungen diese Logik nicht enthalten. Sie können einen Dienst schreiben und Ihren Dienst für Ihre anderen Anwendungen öffnen. 

So schreiben Sie Ihren ersten Windows-Dienst kann Ihnen helfen.

0
Pabuc