【问题标题】:Can you have multiple .net Consoles (as in Console.Writeline)你能有多个 .net 控制台吗(如在 Console.Writeline 中)
【发布时间】:2009-03-22 15:21:59
【问题描述】:

在调试过程中拥有多个控制台(不是我已经拥有的多个监视器)会很方便。我在想像 Console.WriteLine(1, String1) 这样的东西,它将把 String1 发送到一个控制台窗口 1 和 Console.WriteLine(2, String2) ,它将把 String2 发送到控制台窗口 2。

【问题讨论】:

    标签: c# vb.net


    【解决方案1】:

    没有

    一个进程只能与一个控制台关联,因此如果调用进程已经有一个控制台,则 AllocConsole 函数会失败。进程可以使用 FreeConsole 函数将自己从当前控制台中分离出来,然后它可以调用 AllocConsole 来创建一个新的控制台或 AttachConsole 来附加到另一个控制台。

    [http://msdn.microsoft.com/en-us/library/ms681944(VS.85).aspx](http://msdn.microsoft.com/en-us/library/ms681944(VS.85).aspx)

    相反,您可以使用 WinForms 或 WPF 创建多个“控制台”窗口并编写简单的 WriteLine 方法将文本附加到文本框或类似内容。

    另一种选择是打开一个日志文件,并将其用作您的第二个“控制台”。

    【讨论】:

    • 这些函数在.Net中有包装吗?
    • 我不知道。如果没有,应该可以 P/Invoke 它们。
    • 问题是 P/Invoking 它们不会使控制台 API 崩溃(并烧毁)。绝对可以……
    【解决方案2】:

    是否可以在同一个应用程序中拥有 2 个 Windows 控制台?

    没有。 Console 类只是 Win32 控制台思想的一个非常薄的包装器。基本上你在使用时看到的一切 cmd.exe。没有办法在一个进程中创建其中 2 个。

    我可以有 2 个类似控制台的窗口吗?

    是的。基本上可以在 WPF 或 WinForms 中构建一个非常类似于控制台的类。使用它将文本吐出到命令行(如应用程序)。

    【讨论】:

      【解决方案3】:

      我也有同样的需求,我在 SO 中找到了你的问题。很多年后:)

      事实上,.NET 没有这个能力,但是我们可以通过用网格分割屏幕,使用一些缓冲来模拟它。

      这是一个例子:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp1
      {
          class Program
          {
              static void print(int x, int y, int n)
              {
                  for(int i = 0; i < 20; i++)
                  {
                      Console.CursorLeft = x; Console.CursorTop = y++;
                      Console.Write(new string(n.ToString().Last(), 60));
                  }
              }
      
              static void Main(string[] args)
              {
                  var l = new List<int>(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
      
                  while (true)
                  {
                      Console.Clear();
                      Console.CursorVisible = false;
      
                      for (int i = 0; i < l.Count; i++)
                      {
                          print((i % 3) * 60, (i / 3) * 20, l[i]++);
                      }
      
                      Task.Delay(1000).Wait();
                  }
              }
          }
      }
      

      因此屏幕被划分为一个 3x3 的网格,每个屏幕都使用光标位置进行更新。

      它可以被打包成一个库和一个通用 API,就像你描述的那样:

      Console.WriteLine(1, String1)
      Console.WriteLine(2, String2)
      

      希望对某人有所帮助。

      【讨论】:

        【解决方案4】:

        您可能想要考虑多个日志附加器的想法,而不是多个控制台。我不是printf debugging 的忠实粉丝,但我有时确实会看到一个存放多个日志文件的地方。使用log4net 之类的东西,您可以配置多个对应于不同类/命名空间的附加程序和记录器,并将它们记录到单独的文件中。您可以使用日志信息来帮助调试,使用 TextPad 之类的东西在调试时查看日志文件,因为 TextPad 与 NotePad 不同,它检测并允许您查看文件打开时完成的任何更新的内容。可能还有其他编辑器也允许这样做,但我对 TextPad 很熟悉。

        【讨论】:

          猜你喜欢
          • 2011-08-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-26
          • 2012-12-24
          • 2013-11-17
          • 2017-12-04
          • 2011-01-24
          相关资源
          最近更新 更多