当我构建一个快速测试控制台应用程序时,我正在阅读有关 NTVDM.exe 的信息,它在抱怨这个 EXE 的朋友机器上崩溃了。
据我了解,所有 DOS cmd 窗口(包括 C# 控制台应用程序)都以 16 位而不是 32 位运行。
这是真的?这是否意味着我所有的工作控制台应用程序后台应用程序都以 16 位运行,而不是充分利用 32 位?
Windows 服务呢?我相信我们将其编写为控制台应用程序,然后使其作为 Windows 服务运行?
谢谢
当我构建一个快速测试控制台应用程序时,我正在阅读有关 NTVDM.exe 的信息,它在抱怨这个 EXE 的朋友机器上崩溃了。
据我了解,所有 DOS cmd 窗口(包括 C# 控制台应用程序)都以 16 位而不是 32 位运行。
这是真的?这是否意味着我所有的工作控制台应用程序后台应用程序都以 16 位运行,而不是充分利用 32 位?
Windows 服务呢?我相信我们将其编写为控制台应用程序,然后使其作为 Windows 服务运行?
谢谢
任何为 x86 编译的 .NET 应用程序都是 32 位的
C# 控制台应用程序不是在“真正的”dos 中运行 - 它们在 32 位或 64 位环境中运行 - 取决于您的操作系统和 .NET 框架。
据我了解,所有 DOS cmd 窗口(包括 C# 控制台应用程序)都以 16 位而不是 32 位运行。
这是真的?
一点都不。
您可以在 Windows 下运行 DOS 应用程序,它们是 16 位的,但它们看起来有点像控制台的事实几乎只是巧合。
没有 16 位 .NET 应用程序,应用程序是否为控制台模式与它是 16 位还是 32 位没有区别。
MS-DOS 应用程序在 ntvdm 下作为 16 位应用程序运行。
“Windows 控制台”应用程序不是 DOS 应用程序,并且作为本机 Windows 进程运行(EXE 文件的 PE 标头中的位将其标识为控制台应用程序,以便 Windows 可以为应用程序创建/准备 Windows 控制台,如果一个不存在的,例如从 CMD 或 PowerShell 运行控制台应用程序将重新使用已创建的控制台窗口,而在资源管理器中双击 EXE 将为应用程序创建一个新的控制台窗口。)
CMD != DOS
Windows 控制台!= DOS
同样,至少从 Windows 2000 (NT5) 开始,Windows 中就有一个完整的 Windows 控制台 API,如果不是更早的话(尽管可能只有 NT3/4。)
.NET 控制台应用程序。(或任何其他 .NET 应用程序)将作为其 JIT 的目标硬件运行。所以对于 x86,它将是 32 位的。
据我了解,所有 DOS cmd 窗口(包括 C# 控制台应用程序)都以 16 位而不是 32 位运行。
你错了。所有 cmd.exe Windows 都是 32 位或 64 位,具体取决于体系结构。
DOS 大约在十年前与 Windows ME 一起消亡。
我不知道任何能够在 16 位模式下运行的 .NET VM 实现。Microsoft .NET 运行时和 Mono 都只有 32/64 位。我不知道其他较小的,但如果它们可以在 16 位模式下工作,我会感到惊讶。
此外,cmd.exe 以 32 位模式运行,因为 cmd.exe 是 32 位 Windows 应用程序。另一方面,command.com 以 16 位模式运行。
实际上,控制台应用程序远非天生就是 16 位的。这根本不是真的,在 Windows 之前甚至都不是真的,因为 x86 保护模式是 32 位的,所以任何在移植模式下运行的 DOS 游戏或应用程序都是 32 位的。
在 .NET 中,您的 UI 类型(或在 Windows 服务中缺少 UI)不会影响应用程序的字长。默认情况下,.NET 二进制文件是独立于平台的,并且根据主机的 .NET Framework、内核等类型作为 32 位或 64 位应用程序执行。尽管它们也可以直接编译为 64 位。
控制台 exe 没有什么特别之处;它只是一个PE文件。因此,无论控制台、winform exe 还是 windows 服务,它都只会以编译的任何模式运行。
Visual Studio 等永远不会生成 16 位 exe。x86 与 x64 更有趣;-p
可能您的朋友没有安装 .NET 框架(或只有 1.1)。
即使在 DOS 下,“.EXE”也可以是 16 位或 32 位(使用适当的编码或 DOS 扩展库)。
NTVDM.EXE 是 DOS 仿真器,支持在可以假定 CPU 为 16 位且 DOS 系统调用可用的环境中运行 16 位.COM
和文件。.EXE
它与命令提示的唯一关联是文本模式 DOS 程序使用控制台窗口来提供文本模式下的 VGA 屏幕模拟。
如前所述,没有可以在 DOS 下运行的 .NET VM。然而,从 Mono 项目源代码开始并构建一个在 FreeDOS 下运行的项目可能会很有趣......只是为了吓唬你的朋友 ;-)