【问题标题】:Having the output of a console application in Visual Studio instead of the console在 Visual Studio 中而不是控制台中具有控制台应用程序的输出
【发布时间】:2010-03-30 02:57:01
【问题描述】:

使用 Eclipse 在 Java 中执行控制台应用程序时,我看到输出被放在 IDE 本身的文本框中,而不是像在 Visual Studio 中那样弹出控制台。这很方便,因为即使在程序退出后,我仍然可以很好地利用其中写入的文本,因为在我再次运行之前它不会被删除。是否可以使用 Visual Studio 实现类似的目标?我知道而不是这样做

System.Console.WriteLine(str);

我可以的

System.Diagnostics.Debug.WriteLine(str);

但这并不完全相同,因为您会在输出窗口中看到很多“垃圾”,就像所有加载的符号等一样。

更好的是,当您运行应用程序时,是否可以在 IDE 本身中完成所有操作,而不是让控制台运行?

【问题讨论】:

  • 你用的是什么版本的VS?
  • 您有测试结果窗格吗?
  • 我从来没有注意到它。我会检查一下。我应该拥有它吗?

标签: c# visual-studio console


【解决方案1】:

在工具 -> Visual Studio 选项对话框 -> 调试 -> 勾选“将所有输出窗口文本重定向到即时窗口”。

【讨论】:

  • 我已经选中了这个复选框,但我仍然得到一个控制台弹出窗口,并且在“输出”窗口(调试、测试、构建......)或“立即窗口”中什么也没有。
  • @EvenLisle 您需要将应用程序类型更改为 Windows 应用程序,如 stolsvik's answer。无论如何,这个答案中提到的选项对我来说都是默认启用的。
  • “将所有输出窗口文本重定向到立即窗口”究竟是什么意思?如果需要,请使用各种上下文。我对什么是“即时窗口”感到困惑。
  • @TooTone 这个问题清楚地说明了“控制台应用程序”并将其更改为其他东西只是为了调试目的,我什至不能 Console.ReadKey() 只是直截了当太荒谬了!
  • 仅适用于 Debug.WriteLine(),不适用于 Console.WriteLine() :(
【解决方案2】:

Visual Studio 选项对话框中 -> 调试 -> 选中“将所有输出窗口文本重定向到即时窗口”。然后转到您的项目设置并将类型从“控制台应用程序”更改为“Windows 应用程序”。此时,Visual Studio 不再打开控制台窗口,并且输出被重定向到 Visual Studio 中的输出窗口。但是,你不能做任何“创造性的”事情,比如请求键或文本输入,或者清除控制台——你会得到运行时异常。

【讨论】:

  • 我觉得这特别笨拙。我想知道,VS 背后的基本原理是什么?所有现代 IDE 都应该能够在 IDE 中拥有一个面板,作为输入和输出的控制台。 (挠头)
  • 这个问题清楚地说明了 "console application" 并将其更改为其他东西只是为了调试目的,我什至不能 Console.ReadKey() 简直太荒谬了!
  • 不知道为什么,但是当我尝试将我的应用程序的Output type 从 Windows 应用程序恢复到控制台时,当我运行我的应用程序时,无法看到控制台窗口。我能够调试应用程序并且Main 入口点也受到打击。我还恢复了这篇文章中提到的选项设置,但无济于事。我正在使用 VS 2017 社区版。 我失去了控制台窗口(抽泣)。
  • 对于它的价值,在 VS 15.8.7 中,我可以让控制台应用程序的输出重定向的唯一方法是将其更改为 Windows 应用程序,并保留未选中的重定向框。如果我选中该框,它不会显示输出。
【解决方案3】:

使用System.Diagnostics.Trace

根据您附加的侦听器,跟踪输出可以发送到调试窗口、控制台、文件、数据库或一次全部发送。可能性实际上是无穷无尽的,因为实现您自己的 TraceListener 非常简单。

【讨论】:

  • 是的,但我想知道的是,是否可以只做,而不必自己实现。
  • @devoured Trace 类默认输出到调试窗口。如果您还想在其他地方查看输出,您只需要附加额外的侦听器(并且已经编写了几个可以使用)。
  • 我进入调试选项对话框并选择“将所有输出窗口文本重定向到立即窗口”以使跟踪输出进入立即窗口,这样它就不会与调试混淆废话。
【解决方案4】:

各位,是时候检查一下 Visual Studio 的最新版本了。以前对你们中的一些人不起作用的最推荐的解决方案现在可能会起作用。

在 Visual Studio 2017(发布版本 15.4.2 及更高版本)中,转到 Tools > Options > Debugging > General > (Check Box) Redirect all Output Window text to Immediate Window 对我有用。

几点注意事项:

  1. 要查看即时窗口,请确保您处于调试模式。
  2. 现在应该有 3 个其他调试工具可供您使用,即调用堆栈、断点和命令窗口,如下所示:

祝你好运!

【讨论】:

  • 在 v15.9.4 中测试,不起作用(至少不适用于控制台应用程序)。
  • 嗯。如果您可以分享您的配置屏幕截图,我可以尝试在我这边复制该问题。否则,如果已解决,您可以分享您的解决方案。 Visual Studio 15.9.4 的发行说明可在docs.microsoft.com/en-us/visualstudio/releasenotes/… 获得,根据您的环境,您可能会在那里找到一些有用的提示。 Visual Studio 2017(输出窗口)文档docs.microsoft.com/en-us/visualstudio/ide/reference/…
  • 再次检查您正在测试的项目是否创建为“控制台应用程序”,而不是“Windows 应用程序”。您的方法适用于 Windows 应用程序,但这不是 OP 指定的。
【解决方案5】:

您可以创建一个您运行的包装应用程序,而不是直接运行您的真实应用程序。包装应用程序可以监听标准输出并将所有内容重定向到 Trace。然后更改运行设置以启动您的包装器并传入要运行的真实应用程序的路径。

如果调试器附加到包装器,您还可以让包装器自动将调试器附加到新进程。

【讨论】:

    【解决方案6】:

    我知道这只是另一个答案,但我想我会为新的 Web 开发人员写一些东西,他们可能会对“更改为 Windows 应用程序”部分感到困惑,因为我认为默认情况下 MVC 应用程序Visual Studio 2013 默认为类库的输出类型。

    默认情况下,我的 Web 应用程序设置为“类库”的输出类型。你不必改变它。我所要做的就是遵循转到工具 > 选项 > 调试 > 将所有输出窗口文本重定向到即时窗口的建议。然后我使用了上面 Joel Coehoorn 的 System.Diagnostics.Trace 建议。

    【讨论】:

      【解决方案7】:

      相反,您可以在测试结果中收集输出。

      您无法提供输入,但您可以轻松地提供多个具有不同命令行参数的测试,每个测试都收集输出。

      如果您的目标是调试,这是一种提供可重复调试场景的省力方法。

      namespace Commandline.Test
      {
          using Microsoft.VisualStudio.TestTools.UnitTesting;
      
          [TestClass]
          public class CommandlineTests
          {
              [TestMethod]
              public void RunNoArguments()
              {
                  Commandline.Program.Main(new string[0]);
              }
          }
      }
      

      【讨论】:

        【解决方案8】:

        关于System.Diagnostics.Debug 在“输出”窗口中产生大量“垃圾”: 您可以通过右键单击输出窗口来关闭它。例如。有一个项目“模块加载消息”要禁用,还有一个项目“程序输出”要保留。

        【讨论】:

          【解决方案9】:

          您有三种可能性来做到这一点,但这并不是微不足道的。 所有 IDE 的主要思想是它们都是子(调试)进程的父进程。在这种情况下,可以使用标准输入、输出和错误处理程序进行操作。因此 IDE 启动子应用程序并重定向到内部输出窗口。我知道还有一种可能性,但它会在未来出现

          1. 您可以为 Visual Studio 实现自己的调试引擎。调试引擎控制应用程序的启动和调试。您可以在 docs.microsoft.com (Visual Studio Debug engine) 上找到相关示例
          2. 使用 c++ 的 std 处理程序的副本重定向表单应用程序或使用 c# 的 Console.SetOut(TextWriter)。 如果需要打印到输出窗口,则需要使用 Visual Studio 扩展 SDK。 您可以在 Github 上找到第二个变体的示例。
          3. 启动使用 System.Diagnostics.Debug.WriteLine(用于打印到输出)的应用程序,然后它将启动子应用程序。在启动孩子时,您需要使用管道将标准输出重定向到父级。你可以在 MSDN 上找到一个例子。但我认为这不是最好的方法。

          【讨论】:

            【解决方案10】:

            如果您需要 Console.WriteLine 的输出,并且 将所有输出窗口文本重定向到即时窗口 不起作用,并且您需要知道集成测试资源管理器的测试输出,使用 NUnit.Framework 我们的问题已经在 VS 2017 中得到解决

            Jon Skeet 摘自 C# In Depth 的示例: 这会在文本资源管理器中生成此输出:

            当我们点击右侧 Elapsed Time 下的 Blue Output 时,它会生成:

            标准输出是我们想要的输出,由 Console.WriteLine 生成。

            它在 VS 2017 中适用于控制台和 Windows 窗体应用程序,但仅适用于在调试或运行时为测试资源管理器生成的输出;无论如何,这是我对 Console.WriteLine 输出的主要需求。

            【讨论】:

              【解决方案11】:

              一个对我有用的简单解决方案,可以使用控制台功能(ReadKey、带格式和 arg 的字符串等)并查看和保存输出:

              我编写的 TextWriter 写入 ConsoleTrace 并用它替换 Console.Out

              如果你使用 Dialog -> Debugging -> 勾选“Redirect All Output Window Text to the Immediate Window”,你会在即时窗口中得到它并且非常干净。

              我的代码: 在我的代码开头:

              Console.SetOut(new TextHelper());
              

              和班级:

              public class TextHelper : TextWriter
              {
                  TextWriter console;
              
                  public TextHelper() {
                      console = Console.Out;
                  }
              
                  public override Encoding Encoding => this.console.Encoding;
              
                  public override void WriteLine(string format, params object[] arg)
                  {
                      string s = string.Format(format, arg);
                      WriteLine(s);
                  }
              
                  public override void Write(object value)
                  {
                      console.Write(value);
                      System.Diagnostics.Trace.Write(value);
                  }
              
                  public override void WriteLine(object value)
                  {
                      Write(value);
                      Write("\n");
                  }
              
                  public override void WriteLine(string value)
                  {
                      console.WriteLine(value);
                      System.Diagnostics.Trace.WriteLine(value);
                  }
              }
              

              注意:我只覆盖了我需要的东西,所以如果你编写其他类型,你应该覆盖更多

              【讨论】:

                猜你喜欢
                • 2020-04-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-05-23
                • 1970-01-01
                • 1970-01-01
                • 2019-01-18
                相关资源
                最近更新 更多