Консольные приложения на C # все 16-битные?
-
19-08-2019 - |
Вопрос
Я читал о NTVDM.exe когда я создавал быстрое тестовое консольное приложение, и оно разбилось на компьютере друзей, жалующихся на этот EXE.
Насколько я понимаю, все DOS cmd windows (включая консольные приложения C #) запускаются как 16-битные, а не 32-битные.
Это правда?Означает ли это, что все приложения моего бэк-офиса works console app работают как 16-разрядные, а не максимально используют 32-разрядные версии?
Как насчет служб Windows?Насколько я полагаю, мы написали его как консольное приложение, а затем запустили как службу Windows?
Спасибо
Решение
Любое .NET-приложение, скомпилированное для x86, будет 32-разрядным
Консольные приложения C # не выполняются в "реальной" dos - они выполняются в 32-разрядной или 64-разрядной среде - в зависимости от вашей операционной системы и .NET framework.
Другие советы
Насколько я понимаю, все DOS cmd windows (Включая консольные приложения C #) запускаются как 16-битные, а не 32-битные.
Это правда?
Нет, вовсе нет.
Вы можете запускать DOS-приложения под Windows, и они 16-разрядные, но тот факт, что они выглядят немного консольными, в значительной степени просто совпадение.
16-разрядных приложений не существует .СЕТЕВЫЕ приложения, и независимо от того, работает приложение в консольном режиме или нет, не имеет значения, 16 оно или 32 разрядное.
Приложения MS-DOS запускаются как 16-разрядные приложения под управлением ntvdm.
Приложения "Windows Console" не являются приложениями DOS и выполняются как собственный процесс Windows (где бит в PE-заголовке EXE-файла идентифицирует его как консольное приложение, так что Windows может создать / подготовить консоль Windows для приложения, если таковая еще не существует, напримерзапуск вашего консольного приложения из CMD или PowerShell приведет к повторному использованию уже созданного окна консоли, тогда как двойной щелчок по EXE-файлу в Проводнике создаст новое окно консоли для приложения.)
CMD != DOS
Консоль Windows != DOS
Аналогично, существует полноценный консольный API Windows, который присутствует в Windows, по крайней мере, с Windows 2000 (NT5), если не раньше (хотя, вероятно, только NT3 / 4).
Консольное приложение .NET.(или любое другое .NET-приложение) будет работать от имени любого целевого оборудования, к которому оно подключено.Таким образом, для x86 он будет 32-разрядным.
Насколько я понимаю, все DOS cmd windows (включая консольные приложения C #) запускаются как 16-битные, а не 32-битные.
Вы ошибаетесь.Все cmd.exe Windows 32 или 64-разрядная, в зависимости от архитектуры.
DOS умерла вместе с Windows ME почти десять лет назад.
Я не знаю ни о какой реализации виртуальной машины .NET, которая способна работать в 16-разрядном режиме.Microsoft .NET runtime и Mono имеют только 32/64 бита.Я не знаю о других, меньших по размеру, но я был бы удивлен, если бы они могли работать в 16-битном режиме.
Кроме того, cmd.exe запускается в 32-разрядном режиме как cmd.exe является 32-разрядным приложением Windows.С другой стороны, command.com выполняется в 16-разрядном режиме.
На самом деле консольные приложения далеки от того, чтобы быть изначально 16-разрядными.Это просто неправда, этого не было даже до Windows, поскольку защищенный режим x86 является 32-разрядным, поэтому любая игра или приложение для DOS, запущенные в режиме portected, являются 32-разрядными.
В .NET ваш тип пользовательского интерфейса (или отсутствие пользовательского интерфейса, как в службах Windows) не влияет на длину слова приложения.По умолчанию двоичные файлы .NET не зависят от платформы и выполняются как 32-разрядное или 64-разрядное приложение в зависимости от типа .NET Framework, ядра и т.д.хост-машины.Хотя они также могут быть скомпилированы непосредственно в 64-разрядные версии.
В консольном exe нет ничего особенного;это всего лишь PE-файл.Таким образом, независимо от консоли или winform exe или службы Windows, он просто будет запускаться в любом режиме, в котором он был скомпилирован.
Visual Studio etc никогда не сгенерирует 16-разрядный exe-файл.x86 vs x64 интереснее ;-p
Вероятно, у вашего друга нет .NET framework установлен (или имеет только 1.1).
Даже в DOS ".EXE" может быть 16-разрядным или 32-разрядным (с соответствующей кодировкой или библиотекой расширения DOS).
NTVDM.EXE является ли эмулятор DOS, поддерживающий запуск 16-разрядной .COM
и .EXE
файлы в среде, где они могут предполагать, что процессор 16-разрядный и что доступны системные вызовы DOS.Его единственная связь с командными подсказками заключается в том, что программы DOS в текстовом режиме используют окно консоли для эмуляции экрана VGA в текстовом режиме.
Как уже отмечалось, не существует доступной виртуальной машины .NET, которая могла бы работать под управлением DOS.Однако было бы интересно начать с исходных текстов проекта Mono и создать тот, который работает под управлением FreeDOS...просто чтобы напугать своих друзей ;-)