【问题标题】:What happens when starting a .NET console application?启动 .NET 控制台应用程序时会发生什么?
【发布时间】:2011-04-16 16:23:18
【问题描述】:

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

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

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

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

观察:

  • 使用 Mono 和 Linux,我对此和我的测试应用完全没有问题!
  • 使用的字体有影响,我找不到适合所有的字体(即使安装了 asia pack)
  • HKEY_CURRENT_USER\Console 的注册表中调整(更改字体、大小等)会产生影响,并且可以针对每个可执行文件进行定义。

【问题讨论】:

标签: .net unicode replace cmd console-application


【解决方案1】:

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

您不需要cmd.exe 来拥有控制台窗口,任何带有正确标头标志的可执行文件都会导致Windows 为其创建一个控制台,或者如果其父进程有一个控制台窗口,则连接到其父进程的控制台窗口。

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

仅限:

  • 将应用程序的编译器标志更改为 GUI 应用程序,然后使用 Win32 API AllocConsole 创建控制台。 (出于完整性考虑,此处不适用,如果您无法重建可执行文件)。1
  • 创建一个不是控制台应用程序的中间程序(因此不与其父控制台相关联),然后启动您的程序。
  • 创建一个控制台应用程序的中间程序(因此不与其父控制台关联),然后启动您的程序并将CREATE_NEW_CONSOLE标志传递给CreateProcess2

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

2 尚不清楚ProcessStartInfoCreateNoWindow 属性是否为.NET 中的Process.Start 提供相同的功能。如果这样做,这个中介可以用 .NET 编写,但原生解决方案的重量会轻得多——在如此短的程序中,必须加载 .NET 会大大减慢速度。

【讨论】:

  • 谢谢,现在我明白了魔法是如何做到的。我一直错误地认为这是应用程序内置的东西。这使得系统范围的 cmd.exe(至少理论上)成为可能。
【解决方案2】:

尝试设置Console.OutputEncoding 属性。

Console.OutputEncoding = Encoding.UTF8;

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

【讨论】:

  • 除了安装对亚洲语言的支持之外,这绝对是要做的事情之一。但是字体,无论是光栅还是“Lucida Console”都无法正确显示汉字。通过一些技巧,字体“Consolas”起作用了。所以事实证明 cmd.exe 理解 UTF8 但无法正确显示所有字符。我仍然想知道命令行是如何集成到控制台应用程序中的,它与它的关系如何,以及是否有可能提供替代品。
  • FWIW 日文 Windows 在终端中使用的字体是“MS Gothic”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多