C #: Ist es möglich, dass sich eine einzelne Anwendung je nach Switch als Konsole oder Windows-Anwendung verhält?

8

Ich habe eine einfache Anwendung, die ich über Schalter automatisieren möchte. Aber wenn ich es über Schalter laufen lasse, möchte ich nicht wirklich eine Benutzerschnittstelle anzeigen. Ich will nur, dass es läuft, seine Arbeit macht, Dinge in der Konsole ausdruckt und beendet. Auf der anderen Seite, wenn ich es nicht mit irgendwelchen Switches ausführe, möchte ich die Benutzeroberfläche öffnen. Und in diesem Fall möchte ich nicht wirklich ein Konsolenfenster im Hintergrund haben.

Gibt es irgendeine Möglichkeit, dies zu tun, oder muss ich zwei separate Projekte erstellen, eine Konsolenanwendung und eine Windows-Anwendung?

    
Svish 23.11.2009, 23:40
quelle

7 Antworten

11

Ich habe das Erscheinungsbild dieses Verhaltens in der Vergangenheit mit FreeConsole pInvozieren, um das Konsolenfenster zu entfernen.

Sie haben den Ausgabetyp des Projekts als Konsolenanwendung festgelegt. Sie definieren dann den externen Aufruf von FreeConsole :

%Vor%

Dann wechseln Sie in Ihrer Main Methode basierend auf Ihren Bedingungen. Wenn Sie eine Benutzeroberfläche wünschen, rufen Sie FreeConsole auf, bevor Sie das Formular öffnen, um das Konsolenfenster zu löschen.

%Vor%

Ein Konsolenfenster erscheint kurz beim Start, aber in meinem Fall war es akzeptabel.

Das ist ein bisschen hack und hat einen schlechten Geruch, also würde ich ernsthaft darüber nachdenken, ob Sie diesen Weg gehen wollen.

    
adrianbanks 24.11.2009, 00:16
quelle
8

Aus "Das alte neue Ding"

Wie schreibe ich ein Programm, das entweder als Konsole oder als GUI-Anwendung ausgeführt werden kann?

Sie können nicht.

(Ich werde Sie auf den Artikel klicken für die Details, wie man es vortäuscht)

    
Aaron 24.11.2009 00:02
quelle
6

Sicher, einfach eine switch-Anweisung (oder wenn sonst Konstruktion) in die statische main (string [] args), basierend auf Argumenten, die in der Befehlszeile übergeben werden. Ich tue das auch, um zwischen der Ausführung als Dienst oder als Konsole zu wechseln ...

HINWEIS: Legen Sie den Projekttyp als Konsolenanwendung fest

%Vor%

BEARBEITEN: Dank der Antwort von Adrian Bank ist FreeConsole () ein viel besserer Ansatz, um das Console-Fenster zu "dispensieren", als es nur zu minimieren ...

    
Charles Bretana 23.11.2009 23:43
quelle
2

Sie sind zwei verschiedene Paradigmen. Ich denke nicht, dass es eine gute Idee ist, einen Befehlszeilenschalter wie diesen zu verwenden. Warum nicht die Kernlogik in eine Konsolenanwendung einbauen und diese dann bei Bedarf von der GUI aus aufrufen? Dies würde die Benutzeroberfläche von der Implementierung trennen, bietet aber dennoch die Möglichkeit, die Konsolenanwendung bei Bedarf eigenständig zu verwenden.

    
Ed S. 23.11.2009 23:44
quelle
1

Ich glaube, die Antwort ist nein, oder es war das letzte Mal, dass ich dieses Problem untersuchte.

Die ausführbare Datei ist entweder als Anwendung mit Fenster oder als Konsolenanwendung gekennzeichnet. Sie können dies in den Eigenschaften für Ihr Projekt in Visual Studio unter Anwendung, Ausgabetyp

sehen

Sie können das Verhalten simulieren, indem Sie zwei Anwendungen verwenden, eine Konsolenanwendung, die bei Ausführung ohne Argumente die GUI-Anwendung startet. Sie sehen möglicherweise ein Konsolenfenster, wenn Sie nicht von einer bereits geöffneten Konsole aus gestartet haben.

    
Darryl Braaten 24.11.2009 00:00
quelle
0

Ohne eine eigene Version eines Konsolenfensters zu implementieren, lautet die Antwort nein. Wenn Windows Ihre ausführbare Datei lädt, entscheidet es, ob Sie ein Konsolenfenster basierend auf Daten im PE-Header erhalten möchten. Sie können also eine Fensterapplikation nicht mit einem Fenster versehen, aber Sie können eine Windoed-App nicht mit einer Konsole versehen.

    
dkackman 24.11.2009 00:03
quelle
0

Sie können, aber mit einigen Nachteilen:

Sie können verhindern, dass dieses schwarze Fenster beim Start erscheint, wenn Sie das Subsystem Windows kompilieren.

Aber dann müssen Sie den Prozess manuell über AttachConsole (-1) an die aufrufende Konsole (cmd.exe) anhängen Ссылка

Das alleine macht das nicht. Außerdem müssen Sie die drei Standard-Streams über diese Aufrufe an die Konsole umleiten:

%Vor%

Beispiel aus: Ссылка

Das Problem mit Ihrem WinMain-Aufruf besteht darin, dass Windows Ihren Prozess bereits ausgeforscht hat, sodass die aufrufende cmd.exe-Konsole bereits von Ihrer EXE-Datei zurückgegeben wurde und mit dem nächsten Befehl fortfährt. Um zu verhindern, dass du deine exe mit start /wait myexe.exe aufrufen kannst Auf diese Weise erhalten Sie auch den Rückgabewert Ihrer App und können dies wie gewohnt mit% errorlevel% überprüfen.

Wenn es eine Möglichkeit gibt, diesen Prozess mit Untersystemfenstern zu verhindern, lassen Sie es mich wissen.

Hoffe, das hilft.

    
ecreif 16.07.2013 11:07
quelle

Tags und Links