Что делает консоль приложения или приложение Windows Form? - PullRequest
14 голосов
/ 29 мая 2009

[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 и т. Д.) В первом приложении, ни операций над формами во втором. Выглядит идентично мне.

Тем не менее, первое приложение показывает ЧЕРНОЕ окно, а второе ничего не показывает. Что заставляет это работать так?

Ответы [ 4 ]

25 голосов
/ 29 мая 2009

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

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

.subsystem 0x0002       // WINDOWS_GUI

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

.subsystem 0x0003       // WINDOWS_CUI

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

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

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

<OutputType>WinExe</OutputType>

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

<OutputType>Exe</OutputType>

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

<OutputType>Library</OutputType>
9 голосов
/ 29 мая 2009

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

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

Кроме того, если установить его в Консольное приложение, появится черное консольное приложение для проекта Windows Forms.

7 голосов
/ 29 мая 2009

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

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

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

2 голосов
/ 29 мая 2009

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

...