Frage

Ich habe eine c # -Anwendung, die als Windows-Dienst steuert Buchse läuft Verbindungen und andere Dinge. Außerdem gibt es eine andere Windows-Forms-Anwendung zu steuern und konfigurieren diesen Dienst (mit Start Systray, Stop, zeigen Form mit Konfigurationsparametern).

Ich bin mit .NET Remoting der IPC und das war in Ordnung, zu tun, aber jetzt mag ich einigen echten Verkehr und andere Berichte und Remoting zeigen, nicht meine Leistungsanforderungen erfüllen. Deshalb möchte ich in einer beide Anwendungen kombinieren.

Hier ist das Problem:

Wenn ich das Formular aus dem Windows-Dienst gestartet wird, passiert nichts. Googeln um habe ich festgestellt, dass ich den Dienst Recht haben, klicken Sie auf, gehen auf und überprüfen Sie die „Allow Service mit Desktop interagieren“ im Log-Option. Da will ich nicht meine Benutzer bitten, das zu tun, habe ich einige Codes wieder googeln diese Option, um in der regedit des Benutzers während der Installation. Das Problem ist, dass selbst diese Option einstellen, funktioniert es nicht. Ich habe die Anmeldeoptionen des Dienstes zu öffnen (wird geprüft), deaktivieren und erneut prüfen.

So, wie das lösen? Wie ist die beste Art und Weise in einen Windows-Dienst mit einer Systray Kontrolle im gleichen Prozess, verfügbar für jeden Benutzer der Protokollierung zu haben?

UPDATE: Danke für die Kommentare bis jetzt, Jungs. Ich bin damit einverstanden es besser ist, IPC zu verwenden und ich weiß, dass es schlecht ist, Windows-Dienste und Benutzerschnittstellen zu mischen. Auch wenn, möchte ich wissen, wie das zu tun.

War es hilfreich?

Lösung

Zwei getrennte Prozesse, die mit Ihrer Technologie der Wahl kommunizieren. Dienstleistungen mit UI ist eine schlechte Idee . gehen Sie nicht über diese Straße -. Sie werden es nicht bereuen

Ich habe sehr gute Ergebnisse Service-Kommunikation durch eine einfache Steckverbindung mit - dokumentieren Sie Ihre Service-Protokoll gut, halten Sie es so einfach wie möglich, und es wird einfacher sein, als Sie denken,

.

Andere Tipps

In der Praxis sollten Sie nicht Ihr Paar Dienst mit dem Management-UI.

Ich stimme mit Greg. Vielleicht könnten Sie einen anderen IPC-Mechanismus untersuchen. verwendet Vielleicht Steckdosen und ein eigenes Protokoll. Oder, wenn Ihr Dienststeuer App nur den Dienst auf dem lokalen Rechner steuern kann, können Sie Named Pipes (noch schneller).

Hier ist eine Möglichkeit, Dienstleistungen und Formulare Vermischung

http://www.codeproject.com/KB/system/SystemTrayIconInSvc.aspx

ich herausgefunden, wie dies zu tun von dieser Artikel (klicken Sie auf den Link "ändern" in der Methodentabelle).

string wmiPath = "Win32_Service.Name='" + SERVICE_NAME + "'";
using (ManagementObject service = new ManagementObject(wmiPath))
{
    object[] parameters = new object[11];
    parameters[5] = true;  // Enable desktop interaction
    service.InvokeMethod("Change", parameters);
}

ich die Lösung in wenigen Schritten haben, ist dies der Plan

  1. Wir werden nicht ein Service-Projekt mit aa Windows-Formular erstellen, anstatt wir eine Visual Studio-Lösung erstellen werden, die ein Windows-Dienst-Projekt, ein Windows-Formular-Projekt enthält und ein Setup-Projekt.

  2. Die Idee ist, eine Datenbank oder eine Datei oder alles, was Sie mit der Speicherung von Daten bequem sind, in dem Sie die Parameter Ihr Windows-Dienst läuft immer speichern verwenden würden. So dass Ihr Windows-Dienst und Ihre Windows-Formularanwendung sollten in der Lage sein, zu ändern und Abrufen von Daten aus.

  3. Um die wichtigste Form der Ihre Windows-Anwendung ziehen und einen NotifyIcon auf dem Formular ab, in das Register Eigenschaften, durchsuchen und eine ICO Bild auswählen (Sie ein in Visual Studio sreate können, aber das ist ein anderes Thema möglich bekommen auf google oder kontaktieren Sie mich) Dass es in der Taskleiste angezeigt wird, wenn Sie die Anwendung und die wichtigste Form aktiv ist oder gezeigt laufen, versuchen Sie es, die Anwendung auszuführen.

  4. Fügen Sie beide als Ausgänge im Setup-Projekt der Lösung. Um ein Projekt zu einem Setup-Projekt hinzufügen sie in der gleichen Lösung sein muss. Rechts das Setup-Projekt klicken Sie im Projektmappen-Explorer, markieren Sie hinzufügen und dann Projektausgabe wählen, fügen Sie den Windows-Dienst und die Fenster Form gibt und Sie werden sie in der Lösung Explorer unter dem Setup-Projekt sehen.

  5. einen Windows-Dienst Hinzufügen geht weiter als das, aber dass auch ein anderes Thema google it

  6. ist
  7. Erstellen Verknüpfung für die Windows-Anwendung und auf den Startordner hinzugefügt wird auch ein anderes Thema Google oder kontaktieren Sie mich.

    Hinweis Programmieren Sie Ihre Form so, dass die Schließen-Schaltfläche nicht angezeigt und die Form geht Me.Visible = false und doppelt auf das Symbol in der Taskleiste klicken, ist der einzige Weg zu setzen Me.Visible = true.that Art und Weise zu jeder Zeit der Computer startet, Ihre Windows-Anwendung bilden auch gestartet wird und sichtbar wird sofort auf false gesetzt, aber da es ein NotifyIcon mit einem Symbol Bild hat, wird es in der Taskleiste zeigen und einen Doppelklick auf sie macht die Form sichtbar die bearbeiten Einstellungen, die Sie für den Dienst speichern, beginnt der Dienst auch da Sie automatisch bei der Einrichtung des Service im Setup-Projekt eingerichtet haben würde. meine Mail ist iamjavademon@gmail.com für eine bessere Darstellung von Screenshots mit und in voller

  8. erklären

Es ist sehr einfach - Ihr Bedarf einen Thread erstellen für Anwendungsereignisse durchzuführen. Wie diese (Quellcode für C ++ mit CLR, aber Sie kann dies machen in C #):

ref class RunWindow{
public:
    static void MakeWindow(Object^ data)
    {
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 

        Application::Run(gcnew TMainForm());
    };
};

Und Thread erzeugt in Haupt

int main(array<System::String ^> ^args)
{
    bool bService = RunAsService(L"SimpleServiceWithIconInTrayAndWindow");

    if (bService)
    {

        System::Threading::Thread ^thread = gcnew System::Threading::Thread(gcnew ParameterizedThreadStart(RunWindow::MakeWindow));
        thread->Start();

        ServiceBase::Run(gcnew simpleWinService());
        Application::Exit();
    }
    else
    {
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 

        // Create the main window and run it
        Application::Run(gcnew TMainForm());
    }

    return 0;
}

Die Hauptprobleme bei der interaktiven Diensten sind:

  • Sicherheit - anderer Prozess könnte es Nachrichten über Nachrichtensystem senden, um dadurch Zugang zu einem System / LOCAL Prozess gewinnt

  • .
  • Unvollständigkeit - ein interaktiver Dienst sieht nie Shell-Nachrichten, daher kann es nicht mit Notification Area Symbolen interagieren

  • .

Wir regelmäßig TCP und UDP-Verbindungen Informationen zu anderen EXE-Dateien von Dienstleistungen passieren, und in einigen Fällen MSMQ.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top