Ich möchte eine App erstellen, die sich wie folgt verhält:
Für die 1 und 3 kann ich die Argumente im Konstruktor des Formulars wie folgt behandeln:
%Vor%Aber dieser Ansatz erlaubt mir nicht, das Verhalten von 2. in der Liste anzuwenden.
In program.cs
Ich kann es bearbeiten, um mit den Argumenten umzugehen, bevor das Formular überhaupt erstellt wird. Aber was ist der richtige Ansatz bei der Verwendung von Application.Run()
, wenn ich kein Formular weitergeben möchte? Wie werde ich Program
klasseninstanz informieren, dass ich eine Nachricht beenden oder anzeigen muss, dass etwas schief gelaufen ist oder sogar ein kleines Taskleistensymbol anzeigt, dass der Prozess etwas tut (Denken Sie daran wie beim Entpacken).
Würde dieser -Ansatz von MSDN für meine Anwendung korrekt sein?
Ich fand eine einfache und einfach zu implementierende Lösung anhand des Beispiels in meiner Frage von Microsoft.
Ich habe diese Anwendungskontextklasse erstellt, die für alles in der Anwendung verantwortlich ist. Ich verwende diese anstelle eines Formulars in Application.Run()
, wie unten gezeigt.
Um das Verhalten in der Frage zu erreichen, verwende ich ein zweites Formular, das ausgeblendet ist und nur das Taskleistensymbol angezeigt wird. Wenn der Benutzer sehen möchte, wie der Prozess vorgeht, kann er auf das Taskleistensymbol klicken und das Protokollierungsfenster sehen, das im folgenden Beispiel die ConfigurationApplierForm
ist.
Beachten Sie, dass der Konstruktor privat ist, der Hauptteil innerhalb dieser Klasse und als statisch deklariert ist.
%Vor% Main ist hier, ein bisschen anders als das Original. Beachten Sie das Argument in der Methode Run
Außerdem müssen wir dem Projekt mitteilen, dass dies das Startup-Projekt ist.
%Vor%Meinst du das genauso wie Visual Studio?
Wenn das der Fall ist, dann können Sie dies nicht in einer normalen Windows-Anwendung tun - Visual Studio-Cheats.
Das Problem besteht darin, dass eine Windows-Anwendung entweder eine Windows Forms-Anwendung oder eine Konsolenanwendung sein kann, aber nicht beides - sie wird zur Kompilierungszeit festgelegt (für .Net-Anwendungen ist dies im Projekteigenschaftenfenster). Ihre Optionen sind:
Machen Sie Ihre Anwendung zu einer Windows Forms-Anwendung
In diesem Fall funktionieren # 1 und # 3 perfekt, aber für # 2 werden Sie feststellen, dass Sie nicht von der Konsole lesen / schreiben können (weil es keine gibt!). Wenn Ihre Anwendung keine Rückmeldung geben muss, dann könnte das in Ordnung sein - machen Sie Ihre Arbeit wie gewohnt und zeigen Sie kein Formular an:
%Vor%Machen Sie Ihre Anwendung zu einer Konsolenanwendung
In diesem Fall funktioniert # 2 einwandfrei, obwohl # 1 und # 3 gut funktionieren, wird das Konsolenfenster immer im Hintergrund geöffnet sein - wenn Sie das Konsolenfenster schließen, wird Ihre Anwendung beendet.
Das ist wieder in Ordnung, aber persönlich finde ich das ein Hack.
Cheat (mache was Visual Studio macht)
Visual Studio führt einen Cheat durch, indem es zwei separate Anwendungen hat - eine ist eine Konsolenanwendung und die andere ist eine Windows Forms-Anwendung. Die einfache Lösung besteht darin, dies zu belassen und zu erfordern, dass Benutzer beim Ausführen der Befehlszeilenversion eine andere ausführbare Datei starten (z. B. myprogram_g.exe
und myprogram_w.exe
).
Visual Studio geht jedoch noch einen Schritt weiter und hat einen einzigen Einstiegspunkt, devenv
. Dies geschieht durch die Tatsache, dass die Windows-Shell aus Kompatibilitätsgründen immer eine .com
-Datei anstelle von .exe
ausführt, wenn Unklarheiten bestehen. Wenn alle Verknüpfungen usw. auf die ausführbare Datei verweisen, wird% code_% in der Befehlszeile ausgeführt, statt dessen wird die devenv
-Anwendung ausgeführt, die mithilfe von Magie aussortiert, ob sie als Konsole oder Windows-Anwendung ausgeführt wird.
Mein Rat wäre, zwei verschiedene Anwendungen zu erstellen und es dabei zu lassen.
Siehe Wie schreibe ich ein Programm, das entweder als Konsole ausgeführt werden kann oder eine GUI-Anwendung? für mehr Details (lesen Sie unbedingt die Kommentare, die zusätzliche nützliche Vorschläge enthalten).
Siehe auch Wie wird eine Anwendung als GUI- und Konsolenanwendung erstellt? wie devenv.com
dies tut.
Sie können Application.Run () ohne eine Formularinstanz aufrufen.
Auf diese Weise wird die Nachrichtenschleife gestartet, ohne ein Formular zu öffnen.
Sie können MessageBox.Show () auch aufrufen, bevor Sie .Run () aufrufen.
Sie können sogar ein Formular erstellen und öffnen und anschließend Run () aufrufen, ohne ein Argument anzugeben. Es bedeutet lediglich, dass das Schließen des Formulars die Anwendung nicht automatisch beendet.
z. B.
%Vor%Wie bereits erwähnt, führt diese Vorgehensweise beim Ausführen von () dazu, dass beim Schließen der Formulare die Anwendung nicht automatisch geschlossen wird. Sie müssen dies in der Close-Event-Handler des Formulars behandeln. (Application.Exit ())
MSDN online kann Ihnen dabei helfen - überprüfen Sie den Hilfe-Eintrag für Application.Run ().
Tags und Links c# winforms command-line-arguments