2009-05-29 13 views
13

[Visual Studio 2008]Che cosa rende una console dell'app o un'applicazione Windows Form?

ho creato un nuovo progetto per l'applicazione console e modificato per assomigliare a questo:

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

Poi ho creato un altro progetto per l'applicazione Windows Form e modificato è:


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); 
    } 
} 

Ora non ho scritto le funzioni della console (Console.Write ecc.) Nella prima applicazione né ho scritto le operazioni relative ai moduli nella seconda. Sembra identico a me.

La prima applicazione mostra la finestra NERA e la seconda non mostra nulla. Cosa lo fa funzionare così?

+1

È possibile compilare qualsiasi tipo di progetto in un assieme con l'interruttore del compilatore appropriato. – Perpetualcoder

risposta

23

Se si ispezionano i file exe, il file ILDASM può vedere che c'è una differenza nel Manifest (cercare "sottosistema").

In un'applicazione WinForms:

.subsystem 0x0002  // WINDOWS_GUI 

In un'applicazione console:

.subsystem 0x0003  // WINDOWS_CUI 

Ci possono essere più differenze nel codice IL.

Quando si tratta di ciò che rende il compilatore emettere in modo diverso nei due casi, questo è controllato dal valore OutputType del file di progetto:

In un'applicazione WinForms:

<OutputType>WinExe</OutputType> 

In un'applicazione console :

<OutputType>Exe</OutputType> 

per curiosità ho anche controllato che il valore di un progetto Libreria di classi:

<OutputType>Library</OutputType> 
+0

Ho capito, ma la mia domanda è esattamente questa: cosa rende Visual Studio (o compilatore) crea questa differenza? Qualunque cosa in applicazione deve essere governata dal codice che scriviamo. Destra? – Hemant

+1

Per il compilatore non c'è differenza, tutto ha a che fare con il tipo di assieme che hai impostato nelle impostazioni del progetto e nei riferimenti. –

+0

Aggiunto aggiornamento con differenze di file di progetto. –

9

Nelle proprietà del progetto, scheda Applicazione, Tipo di uscita, è possibile impostare su "Applicazione Windows" o "Applicazione console".

Credo che dietro le quinte VS faccia esattamente quello che Fredrik ha presentato nel suo post.

Inoltre, impostandolo su Applicazione console verrà visualizzata l'applicazione console nera per il progetto Windows Forms.

+1

Per completezza è disponibile anche un'opzione per l'output in una libreria di classi . – RichardOD

2

Se si guarda nel file di progetto (csproj) vedrete che il target è definito lì come una console o un'applicazione di Windows.

7

Sotto il cofano, non c'è differenza in una winform vs console exe ad eccezione di un flag nell'intestazione PE che dice "I need a console". L'intestazione PE non è controllata dal tuo C# (poiché è una cosa di compilazione, non una cosa di runtime), quindi è definita nel file di progetto (<OutputType>...</OutputType>).

O alla riga di comando (csc /target:exe rispetto a csc /target:winexe).

Probabilmente, avrebbero potuto utilizzare un attributo a livello di assieme intercettato dal compilatore, ma questo avrebbe davvero aiutato? Probabilmente no.

+1

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

Problemi correlati