2009-05-29 9 views
13

[Visual Studio 2008]Was macht eine App-Konsole oder Windows Form-Anwendung?

habe ich ein neues Projekt für Konsolenanwendung und modifiziert es wie folgt aussehen:

class Program 
{ 
    static void Main (string[] args) { 
     Thread.Sleep (2000); 
    } 
} 

Dann habe ich ein anderes Projekt für Windows Forms-Anwendung und modifiziert es:


static class Program 
{ 
    //[STAThread] commented this line 
    static void Main (string[] args) { //Added args 
     //Commented following lines 
     //Application.EnableVisualStyles(); 
     //Application.SetCompatibleTextRenderingDefault (false); 
     //Application.Run (new Form1()); commented this line 
     Thread.Sleep (2000); 
    } 
} 

Jetzt habe ich weder Konsolenfunktionen (Console.Write etc.) in der ersten Anwendung geschrieben, noch habe ich Formulare verwandte Operationen in der zweiten geschrieben. Sieht mit mir identisch aus.

Noch die erste Anwendung zeigt BLACK Fenster und die zweite zeigt nichts. Was macht es so?

+1

können Sie jeden Projekttyp in eine Assembly mit dem richtigen Compiler-Schalter kompilieren. – Perpetualcoder

Antwort

23

Wenn Sie die EXE-Dateien Usine ILDASM überprüfen, können Sie sehen, dass es einen Unterschied in der Manifest (suchen Sie nach "Subsystem").

In einer Anwendung WinForms:

.subsystem 0x0002  // WINDOWS_GUI 

In einer Konsolenanwendung:

.subsystem 0x0003  // WINDOWS_CUI 

Es gibt mehr differencies im IL-Code sein kann.

Wenn es darum geht, was der Compiler dies anders in den beiden Fällen emittieren macht, wird dies durch die Outputwert Projektdatei gesteuert:

In einer Anwendung WinForms:

<OutputType>WinExe</OutputType> 

In einer Konsolenanwendung :

<OutputType>Exe</OutputType> 

aus Neugier ich habe auch diesen Wert für ein Klassenbibliothek-Projekt:

<OutputType>Library</OutputType> 
+0

Ich verstehe, aber meine Frage ist genau das: Was macht Visual Studio (oder Compiler) diesen Unterschied? Alles in der Anwendung muss von dem Code, den wir schreiben, abhängen. Recht? – Hemant

+1

Für den Compiler gibt es keinen Unterschied, es hat alles mit dem Assembly-Typ zu tun, den Sie in den Projekteinstellungen und den Referenzen festgelegt haben. –

+0

Hinzugefügt Update mit Projektdatei Unterschiede. –

9

In Projekteigenschaften, Registerkarte "Anwendung", Ausgabetyp können Sie "Windows-Anwendung" oder "Konsolenanwendung" festlegen.

Ich glaube, dass hinter den Kulissen VS genau das tut, was Fredrik in seinem Beitrag präsentierte.

Wenn Sie es auf Console Application setzen, wird Ihnen die schwarze Konsolenanwendung für das Windows Forms-Projekt angezeigt.

+1

Der Vollständigkeit halber gibt es auch eine Option, um in eine Klassenbibliothek ausgegeben zu werden . – RichardOD

2

Wenn Sie in die Projektdatei (csproj) schauen, sehen Sie, dass das Ziel dort entweder als Konsole oder als Windows-App definiert ist.

7

Unter der Haube gibt es keinen Unterschied in einer Winform vs Konsole exe außer für eine Flagge in der PE-Header, die sagt: "Ich brauche eine Konsole". Der PE-Header wird nicht von Ihrem C# gesteuert (da es sich um eine Kompilierungs-Sache handelt, nicht um eine Laufzeit-Sache), so dass dies stattdessen in der Projektdatei definiert ist (<OutputType>...</OutputType>).

Oder an der Befehlszeile (csc /target:exe vs csc /target:winexe).

Möglicherweise hätten sie ein Assembly-Level-Attribut verwenden können, das der Compiler abgefangen hat - aber hätte das wirklich geholfen? Wahrscheinlich nicht.

+1

Ebenfalls relevant: http://stackoverflow.com/questions/4866352/what-are-the-effects-of-the-pe-header-subsystem-field – jnylen