Что делает консоль приложений или приложение 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.