2010-01-29 7 views
5

Wir haben einen Windows-Dienst ausgeführt und wir haben auch eine Konsolenanwendung, die wir verwenden, um diesen Dienst zu konfigurieren, haben wir auch eine Option zu sehen, einige Protokolle aufgezeichnet werden.Konsolen-App für die Kommunikation mit einem Windows-Dienst

Das sehr hässliche daran ist, dass diese Kommunikation von einer Textdatei gemacht wird, schreibt die Konsole App in eine Textdatei und der Dienst liest es und umgekehrt.

Was würden Sie für diese Kommunikation verwenden? TCP/IP ist keine Option, da die Konsolenanwendung nur für den lokal ausgeführten Dienst verwendet wird.

Windows API SendMessage sollte der Weg zu gehen?

danke!

Antwort

6

Ich würde WCF als das erste Ding empfehlen, das für alle Kommunikationen auf Windows zu betrachten ist, wenn man .net verwendet, wie es für diese Art Sache und seine relativ einfach zu verwenden gebaut wird. Da Sie TCP ausschließen, würde ich vorschlagen, die Named Pipes Binding zu verwenden.

Es gibt auch eine Reihe von Windows Comms Apis für die Kommunikation innerhalb der Maschine verfügbar. Named Pipes (wie erwähnt), MailSlots, Shared Memory (Memory Mapped files) usw.

Mein Vorschlag wäre, benannte Pipes entweder mit WCF oder nativ zu verwenden.

0

Gemeinsamer Speicher? Einen Artikel über Codeproject finden Sie unter here, hier ist ein weiterer fastipc Artikel auf der gleichen Website. Es gibt einen Blogeintrag, der detailliert beschreibt, wie man eine memory mapped file für die Freigabe über einen Wrapper verwendet.

Hoffen, dass dies hilft, Mit freundlichen Grüßen, Tom.

1

Sie können das Risiko von Deadlocks verringern, wenn Sie nicht blockierende Methoden zur Nachrichtenübergabe verwenden. PostMessage oder SendNotifyMessage sind besser als , weil sie den Anrufer nicht blockieren.

Aber sie hängen davon ab, dass der Dienst einen Fenstergriff hat. Macht es?

Sie können auch die WM_COPYDATA Nachricht verwenden, um mehr als nur ein wParam ein lParam zu übergeben. Wenn Sie diese Nachricht mit PostMessage verwenden, müssen Sie darauf achten, den Speicher nicht freizugeben, bis der Empfänger damit fertig ist. Am sichersten ist es, SendMessage für WM_COPYDATA zu verwenden.

+0

+1 - Ich bin mir nicht sicher, was das OP für ihre Codierung verwendet, aber ich habe WM_COPYDATA PostMessage für die Kommunikation zwischen Prozessen in der Vergangenheit verwendet. Wenn der Speicher richtig zugewiesen ist, richten Sie ihn so ein, dass der Empfänger die Zuweisung beim Nachrichtenempfang rückgängig macht. Dies kapselt es asynchron. – ChrisBD

+0

Beachten Sie, dass der PostMessage-Ansatz unter Vista und später unter bestimmten Umständen aufgrund der Isolation von Sitzung 0 fehlschlägt - siehe z. http://blogs.technet.com/askperf/archive/2007/04/27/application-compatibility-session-0-isolation.aspx –

Verwandte Themen