启动.NET控制台应用程序时会发生什么情况?

问题描述:

.NET控制台应用程序启动时发生了什么?启动.NET控制台应用程序时会发生什么情况?

在进程资源管理器中,当启动exe时,我想知道为什么我看不到“cmd.exe”进程作为控制台应用程序的父进程。那么显示的是什么?

有没有办法替换另一个“默认”控制台窗口?我想这意味着修改“控制台子系统”。

创建GUI应用程序而不是控制台应用程序不是一个选项,因为我没有所有可能的工具的来源。

观察:

  • 使用Mono和Linux,我在所有这方面,我的测试应用程序没有问题!
  • 使用的字体有一个影响,我无法找到一个字体,适合一切(即使安装了亚洲组)在注册表HKEY_CURRENT_USER\Console
  • 扭捏(更改字体,大小,...)是具有影响力和能按可执行文件定义。
+0

此答案中的任何东西有用吗? http://stackoverflow.com/questions/1259084/what-encoding-code-page-is-cmd-exe-using/1259468#1259468 – 2010-09-24 09:15:38

在这个过程中探险,在开始的时候EXE我很奇怪,为什么我不能看到一个“cmd.exe的”过程作为控制台应用程序父进程。那么显示的是什么?

你不需要cmd.exe有一个控制台窗口中,用正确的头标志的任何可执行程序将导致Windows来创建一个控制台,或连接到它的父进程的控制台窗口,如果它的父有一。

有没有办法将另一个“默认”控制台窗口替换?

只有:

  • 改变编译标志为您的应用程序是一个GUI应用程序,然后使用Win32 API AllocConsole创建一个控制台。 (包括完整性,如果你不能重建可执行文件,将不会在这里适用)。
  • 创建一个中间程序不是控制台应用程序(因此不与其父控制台关联)然后启动您的程序。
  • 创建一个中间程序控制台应用程序(因此不与其父控制台关联),然后启动程序,并将CREATE_NEW_CONSOLE标志传递给CreateProcess

Editbin.exe可以更改标志(editbin /subsystem:WINDOWS),但随后的应用程序将需要调用AllocConsole

目前尚不清楚如果ProcessStartInfoCreateNoWindow属性在.NET Process.Start提供相同的功能。如果是这样的话,这个中介可以用.NET编写,但是一个本地解决方案的重量要轻很多,在这么短的程序中加载.NET会显着减慢速度。

+0

谢谢,现在我明白魔法是如何完成的。我一直认为它是内置于应用程序中的东西。这使得系统范围的cmd.exe(理论上至少)成为可能。 – jdehaan 2010-09-27 06:41:04

尝试设置Console.OutputEncoding属性。

Console.OutputEncoding = Encoding.UTF8; 

这将有效地调用Win32本地SetConsoleOutputCP function控制台代码页设置为指定编码的CodePage财产。

+0

除了安装对亚洲语言的支持之外,这绝对是要做的事情之一。但字体,既不是光栅也不是“Lucida控制台”能够正确显示汉字。用一些技巧字体“Consolas”工作。所以事实证明cmd.exe unterstands UTF8,但不能正确显示所有的字符。不过,我想知道命令行如何集成到控制台应用程序中,它是如何与它绑定的,以及是否有可能为它提供替换。 – jdehaan 2010-09-24 09:38:39

+0

FWIW日文Windows在终端中使用的字体是'MS Gothic'。 – bobince 2010-09-24 17:29:19