Что делает консоль приложений или приложение Windows Form?

[Visual Studio 2008]

Я создал новый проект для консольного приложения и изменил его так:

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

Затем я создал другой проект для приложения Windows Form и изменил его:


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

Теперь у меня нет ни письменных консольных функций (Console.Write и т.д.) в первом приложении, ни во всех других случаях я не написал связанных с документами операций. Выглядит идентично мне.

По-прежнему первое приложение показывает BLACK-окно, а второе ничего не показывает. Что заставляет это работать так?

Ответы

Ответ 1

Если вы проверите exe файлы usine ILDASM, вы увидите, что есть разница в манифесте (найдите "подсистему" ).

В приложении Winforms:

.subsystem 0x0002       // WINDOWS_GUI

В консольном приложении:

.subsystem 0x0003       // WINDOWS_CUI

В коде IL может быть больше различий.

Когда дело доходит до того, что компилятор испускает это по-другому в двух случаях, это контролируется файлом проекта. Значение OutputType:

В приложении Winforms:

<OutputType>WinExe</OutputType>

В консольном приложении:

<OutputType>Exe</OutputType>

Из любопытства я также проверил это значение для проекта библиотеки классов:

<OutputType>Library</OutputType>

Ответ 2

В свойствах проекта, вкладке "Приложения", "Тип вывода" вы можете установить "Приложение Windows" или "Консольное приложение".

Я считаю, что за кулисами VS делает то, что представил Фредрик в своем посте.

Также, установив его в Console Application, вы увидите черное консольное приложение для проекта Windows Forms.

Ответ 3

Под капотом нет разницы в winform vs console exe, за исключением флага в PE-заголовке, в котором говорится: "Мне нужна консоль". Заголовок PE не управляется с вашего С# (поскольку это компиляция, а не среда выполнения), поэтому вместо этого он указан в файле проекта (<OutputType>...</OutputType>).

Или в командной строке (csc /target:exe vs csc /target:winexe).

Возможно, они могли использовать атрибут уровня сборки, который перехватил компилятор, но это действительно помогло? Наверное, нет.

Ответ 4

Если вы посмотрите в файле проекта (csproj), вы увидите, что цель определена там как консольное приложение или приложение Windows.