Domanda

[Visual Studio 2008]

Ho creato un nuovo progetto di 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 ho né scritto funzioni della console (Console.Write etc.) in prima applicazione né io hanno scritto forme operazioni connesse in seconda. Sembra identico a me.

Ancora prima applicazione mostra finestra nera e la seconda non mostra nulla. Ciò che rende il lavoro come questo?

È stato utile?

Soluzione

Se si controlla i file exe usine ILDASM si può vedere che c'è una differenza nel Manifesto (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 verificato che il valore di un progetto Libreria di classi:

<OutputType>Library</OutputType>

Altri suggerimenti

Nella proprietà del progetto, scheda Applicazione, Tipo di uscita è possibile impostare per 'Applicazione Windows' o 'Applicazione console'.

Credo che dietro le quinte VS fa esattamente ciò che Fredrik presentato nel suo post.

Inoltre, impostandola su Applicazione console vi mostrerà l'applicazione console nera per il progetto Windows Form.

Sotto il cofano, non v'è alcuna differenza in una WinForm vs console exe ad eccezione di una bandiera in PE-header che dice "ho bisogno di una console". L'intestazione PE non è controllata dal vostro C # (in quanto si tratta di una cosa di compilazione, non una cosa runtime), quindi questo è definito nel file di progetto, invece (<OutputType>...</OutputType>).

In alternativa alla riga di comando (csc /target:exe vs csc /target:winexe).

Probabilmente, avrebbero potuto utilizzare un attributo a livello di assieme che il compilatore intercettato - ma sarebbe che in realtà hanno aiutato? Probabilmente no.

Se si guarda nel file di progetto (csproj) vedrete che il target è definito ci sia come una console o finestre app.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top