Windows Forms + Befehle von der Konsole in C #

8

Ich habe ein paar Themen zu Programmen gelesen, die Windows Forms und Konsolenanwendungen kombinieren, aber es scheint, dass meine Frage noch nicht gelöst ist. Ist es möglich, ein Programm von cmd-line auszuführen und die Anwendung über Formulare und cmd-line-Befehle steuern zu können? Es bedeutet:

  • für normale Benutzer der Anwendung, um die Anwendung über (Windows Forms) Formulare zu steuern,
  • zum Debuggen und fortgeschrittene Benutzer, um die Anwendung über die Konsole zu steuern (und optional sehen, was in Windows Forms passiert))

Ich weiß, dass das, was ich will, eine ziemlich große Sache ist, und es wird wahrscheinlich eine Menge Arbeit bedeuten, aber ich würde trotzdem gerne wissen, wie es richtig gemacht wird.

    
Martin Vseticka 06.03.2010, 17:45
quelle

6 Antworten

5

Es ist nicht schwierig, P / Invoke die AlloConsole () API-Funktion, um Ihre eigene Konsole zu erstellen. Stellen Sie beispielsweise Ihre Quellcode-Datei Program.cs folgendermaßen dar:

%Vor%     
Hans Passant 06.03.2010, 18:59
quelle
1

Sie müssen nur Ihre Windows Forms-Anwendung mit einem ApplicationContext anstelle eines Formulars. Sie sind dann nicht auf das Hauptformular angewiesen und können wie eine Konsolenanwendung agieren.

Sie können auch einfach eine ausführbare Befehlszeile erstellen und sie mit den Windows Forms-Bibliotheken verknüpfen, um sie zu verwenden.

Eine andere Möglichkeit wäre, eine Art Starter zu verwenden, der die Windows Forms-Anwendung startet, und ein Befehlszeilentool, das über lokale Netzwerke oder eine andere prozessübergreifende Kommunikation mit der Windows Forms-Anwendung kommuniziert, D-Bus oder ähnliche Systeme - viele Wege führen nach Rom ...

    
Oliver Friedrich 06.03.2010 18:12
quelle
1

Ja, was Sie wollen, ist sehr gut möglich. Sie haben Optionen. Einige, die ich mir vorstellen kann ...:

  1. Verwenden Sie die Benutzeroberflächenautomatisierung zum Schreiben einer Controlleranwendung, die eine Verbindung zur Windows Forms-Anwendung herstellen und diese steuern kann. Dies ist neu in Windows Vista. Es gibt verwaltete Klassen, die im Namespace System.Windows.Automation enthalten sind, der zuerst in WPF ausgeliefert wurde und in .NET 3.0 angekommen ist. (Jetzt, da ich darüber nachdenke, bin ich mir nicht sicher, ob "neu in Windows Vista" wahr ist. Es könnte "neu in .NET 3.0" sein, was bedeutet, dass es auch unter Windows XP funktioniert. Hmmm ....) UI Automation erfordert Kein Codewechsel in die Windows Forms-Anwendung, aber es kann eine Art Low-Level sein, weil Sie jeden Mausklick programmieren oder ausschneiden / einfügen müssen. Siehe die Antwort zu Stack Overflow-Frage Gibt es eine Möglichkeit, eine EXE-Datei eines Drittanbieters aus VB.NET zu steuern? .

  2. Ändern Sie Ihre Windows Forms-Anwendung, um ihre Funktion über eine WM_COPYDATA bereitzustellen Schnittstelle. Dann kann Ihre Client-Anwendung damit kommunizieren. Auch hier gibt es zwei verschiedene Anwendungen, von denen eine die andere steuern oder abfragen kann. Das .NET Reflector-Tool ist ein gutes Beispiel für diesen Ansatz. Es gibt einen ReflectorController, der als Teil des ReflectorAddins-Projekts auf CodePlex verfügbar ist. Der Controller ist ein Befehlszeilentool, das WM_COPYDATA -Nachrichten an Reflector senden kann, um eine neue Assembly zu öffnen, zu einer bestimmten Klasse zu navigieren usw.

    Der Code für den Controller: Ссылка

    Dieser Ansatz funktioniert für jede Windows Forms-Anwendung. Sie müssen die WndProc-Methode überschreiben. Um zu sehen, wie, The Code Project Artikel Verwenden Sie WM_COPYDATA zum Senden von Daten an / von C ++ - und C # -Windows-Prozessen .

    Ich habe diesen Ansatz auch verwendet, um einen Windows Forms-basierten Fortschrittsmonitor zu erstellen, mit dem der Fortschritt lang andauernder Tests visuell angezeigt werden kann.

  3. Machen Sie in Ihrer Anwendung ein COM-Serverobjekt verfügbar, das programmiert werden kann. Genau so stellt Microsoft die Office-Funktion für Anwendungen bereit. Office Automation ermöglicht jedes COM-fähige Programm (C #, VBScript , PowerShell , Perl, PHP usw.), um Office-Anwendungen zu" fahren ". Die Office-Anwendung ist während des Vorgangs sichtbar. Dieser Ansatz erfordert zusätzlichen Code in Ihrer Windows Forms-Anwendung; Insbesondere müssen Sie ein COM-Objekt hosten und es mit Ihrer UI-Ebene verbinden. Dies ist möglicherweise vorzuziehen, wenn Sie maximale Flexibilität für Superuser wünschen - sie können ihre eigenen Skripts schreiben, um diese Komponente zu steuern.

Ich bin mir sicher, dass es andere Möglichkeiten gibt.

    
Cheeso 06.03.2010 18:18
quelle
0

Ich erinnere mich an IronPython , das in einer Demo verwendet wurde, die Windows Forms von Pythons Kommandozeilen-Interface aus kontrolliert ( IDLE ).

Bearbeiten: Ich konnte das Originalvideo nicht finden, aber dieses sollte zeigen, was ohne viel Aufwand möglich ist. Sehen Sie sich dieses Video an und springen Sie bis 19:00 Uhr.

    
Philip Fourie 06.03.2010 17:49
quelle
0

Das wäre möglich. Sie müssen in das Threading des Windows Forms-Formulars schauen, möglicherweise unter Verwendung einer separaten Anwendungsdomäne innerhalb desselben Prozesses. Sie könnten nach dem Erstellen eines Proxy-Objekts suchen (eine Art Nachrichtenklasse, die MarshalByRefObject erbt).

    
IAbstract 06.03.2010 18:06
quelle
0

Normalerweise haben Sie beim Betrachten Ihrer Anwendung eine UI-Schicht und eine Business-Schicht (und eine Datenschicht, und wer kennt viel mehr Schichten). Sie können sich den Konsolenclient als einen UI-Layer (mit einfachen Befehlseingaben) und den Windows Forms-Client als einen anderen vorstellen.

Überprüfen Sie einfach beim Start der Anwendung nach Befehlszeilenargumenten. Wenn Argumente angegeben sind, instanziieren Sie die einfachen Konsolenklassen, andernfalls instanziieren Sie die (wahrscheinlich komplexeren) Windows Forms-Klassen.

Wenn Sie möchten, dass Ihre Änderungen in der Windows Forms-Anwendung widergespiegelt werden (während Sie sie über die Konsolenanwendung steuern), richten Sie Ihre Anwendungen so oft wie möglich mit der Datenbindung ein. Lassen Sie Ihre Business-Schicht widerspiegeln, was in Ihrer Anwendung tatsächlich vor sich geht.

    
Zyphrax 06.03.2010 18:15
quelle

Tags und Links