Консольные приложения C# все 16 бит?

Я читал о NTVDM.exe, когда создавал консольное приложение для быстрого тестирования, и оно зависало на машине друзей, жалующихся на этот EXE-файл.

Как я понимаю, все окна DOS cmd (включая консольные приложения C#) работают как 16-битные, а не 32-битные.

Это правда? Означает ли это, что все мои бэк-офисные приложения для рабочих консолей работают как 16-битные, а не максимально используют 32-битные?

Как насчет служб Windows? Как я полагаю, мы написали его как консольное приложение, а затем запустили как службу Windows?

Спасибо

9 ответов

Решение

Любое приложение.NET, скомпилированное для x86, будет 32-разрядным

Консольные приложения C# не работают в "реальных" режимах - они работают в 32-битной или 64-битной среде - в зависимости от вашей ОС и платформы.NET.

Как я понимаю, все окна DOS cmd (включая консольные приложения C#) работают как 16-битные, а не 32-битные.

Это правда?

Нет, совсем нет.

Вы можете запускать DOS-приложения под Windows, и они 16-битные, но тот факт, что они выглядят немного консольно, в значительной степени просто совпадение.

16-разрядных приложений.NET не существует, и независимо от того, является ли приложение консольным или нет, не имеет значения, является ли оно 16- или 32-разрядным.

Приложения MS-DOS запускаются как 16-битные приложения под ntvdm.

"Консоль Windows" Приложения не являются приложениями DOS и выполняются как собственный процесс Windows (где бит в заголовке PE файла EXE определяет его как консольное приложение, так что Windows может создать / подготовить консоль Windows для приложения, если оно еще не существует, например, при запуске вашего консольного приложения из CMD или PowerShell будет повторно использоваться уже созданное консольное окно, в то время как двойной щелчок на EXE в проводнике создаст новое консольное окно для приложения.)

CMD!= DOS

Консоль Windows!= DOS

Аналогично, в Windows существует полный API-интерфейс консоли Windows, по крайней мере, с Windows 2000 (NT5), если не раньше (хотя, вероятно, только для NT3/4).

Консольное приложение.NET. (или любое другое приложение.NET) будет работать как любое целевое оборудование, для которого оно предназначено JIT. Так что для x86 это будет 32 бит.

Как я понимаю, все окна DOS cmd (включая консольные приложения C#) работают как 16-битные, а не 32-битные.

Вы неправы. Все окна cmd.exe являются 32- или 64-разрядными, в зависимости от архитектуры.

DOS умер вместе с Windows ME почти десять лет назад.

Я не знаю ни о какой реализации.NET VM, способной работать в 16-битном режиме. Microsoft .NET runtime и Mono имеют только 32/64 бита. Я не знаю о других меньших, но я был бы удивлен, если бы они могли работать в 16-битном режиме.

Кроме того, cmd.exe работает в 32-разрядном режиме, так как cmd.exe является 32-разрядным приложением Windows. С другой стороны, command.com работает в 16-битном режиме.

На самом деле консольные приложения далеко не 16-битные. Это просто не соответствует действительности, это было даже не так до Windows, поскольку защищенный режим x86 является 32-разрядным, поэтому любая игра или приложение для DOS, работающее в режиме с подключением, является 32-разрядным.

В.NET ваш тип пользовательского интерфейса (или его отсутствие, как в Windows Services) не влияет на длину слова приложения. По умолчанию двоичные файлы.NET не зависят от платформы и выполняются как 32-разрядные или 64-разрядные приложения в зависимости от типа.NET Framework, ядра и т. Д. Хост-компьютера. Хотя они также могут быть скомпилированы непосредственно в 64-битные.

NTVDM.EXE - эмулятор DOS, поддерживающий работу 16-бит .COM а также .EXE файлы в среде, где они могут предполагать, что ЦП является 16-разрядным и доступны системные вызовы DOS. Его единственная связь с командными приглашениями заключается в том, что программы DOS в текстовом режиме используют окно консоли для обеспечения эмуляции экрана VGA в текстовом режиме.

Как уже отмечалось, нет доступной виртуальной машины.NET, которая может работать под DOS. Тем не менее, может быть интересно начать с исходных текстов проекта Mono и создать тот, который работает под FreeDOS... просто чтобы напугать своих друзей;-)

В консольном exe нет ничего особенного; это просто файл PE. Таким образом, независимо от того, будет ли консоль работать с Winform Exe или Windows, она будет работать в любом режиме, который был скомпилирован.

Visual Studio и т. Д. Никогда не будут генерировать 16-битный исполняемый файл. х86 против х64 интереснее;-p

Возможно, у вашего друга не установлена ​​платформа.NET (или только 1.1).

Даже в DOS ".EXE" может быть 16-битным или 32-битным (с соответствующей кодировкой или библиотекой расширителя DOS).

Другие вопросы по тегам