使用.NET的ANSI着色控制台输出

我尝试使用ANSI转义码生成彩色控制台输出,并使用以下最小C#程序:

using System; // test.cs class foo { static void Main(string[] args) { Console.WriteLine("\x1b[36mTEST\x1b[0m"); } } 

我在Windows 7 x64上使用csc.exe运行Ansicon v1.66( Microsoft(R)Visual C#编译器版本4.6.0081.0 )。

彩色输出在这种配置下工作正常; Ansicon本身运作完美无瑕。

要进行交叉检查,我使用一个与C#程序100%等效的node.js单行程序:

 // test.js console.log("\x1b[36mTEST\x1b[0m"); 

而且,更基本的,手工制作的文本文件:

文本文件hex编辑器截图

两者都正确地做了预期的事情:打印一个青色的字符串“TEST”:

在此处输入图像描述

只有我用csc构建的test.exe才能打印其他内容。 为什么?

如果使用AnsiCon x64环境,则需要为/platform:x64编译程序/platform:x64如果使用AnsiCon x86 / 32位版本,则需要使用/platform:x86编译。 确切的原因是一个谜……

最初我认为你需要这一切:

您需要获取StandardOutput并让Console.WriteLine相信您写入文件而不是控制台并使用ASCII编码。

这是它的工作方式:

  var stdout = Console.OpenStandardOutput(); var con = new StreamWriter(stdout, Encoding.ASCII); con.AutoFlush = true; Console.SetOut(con); Console.WriteLine("\x1b[36mTEST\x1b[0m"); 

.Net Console.WriteLine使用内部__ConsoleStream来检查Console.Out是作为文件句柄还是控制台句柄。 默认情况下,它使用控制台句柄,因此通过调用WriteConsoleW写入控制台。 在评论中你会发现:

虽然应用程序可以使用ANSI模式下的WriteConsole来编写ANSI字符,但控制台不支持ANSI转义序列。 但是,某些function提供了相同的function。 有关更多信息,请参阅SetCursorPos,SetConsoleTextAttribute和GetConsoleCursorInfo。

要将字节直接写入控制台而不使用WriteConsoleW干扰简单的文件句柄/流,这将通过调用OpenStandardOutput来实现。 通过将该流包装在StreamWriter ,我们可以使用Console.SetOut再次设置它,我们就完成了。 字节序列被发送到OutputStream并由AnsiCon拾取。

请注意,这仅适用于AnsiCon等适用的终端仿真器,如下所示:

在此处输入图像描述