在Visual Studio中将控制台应用程序的输出显示在界面上,而不是在控制台上。

162

在使用Eclipse进行Java控制台应用程序开发时,我看到输出信息被放置在IDE自身的文本框中,而不是像Visual Studio那样弹出一个控制台。这非常方便,因为即使程序退出后,我仍然可以利用其中的文本内容,因为它不会在下一次运行之前被清除。在Visual Studio中是否也有类似的功能?我知道我们可以使用

System.Console.WriteLine(str);

我可以做到

System.Diagnostics.Debug.WriteLine(str);

但它并不完全相同,因为你会在输出窗口中获取大量的“垃圾信息”,例如所有加载的符号等。

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


你使用的是哪个版本的VS? - Gabe
你有测试结果窗格吗? - Gabe
我从未注意到它。我会检查一下。我需要它吗? - devoured elysium
14个回答

87

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


92
我已经勾选了这个复选框,但我仍然会弹出一个控制台窗口,"输出"窗口(调试、测试、构建等)或"立即窗口"中没有任何内容显示。 - GuiSim
6
@EvenLisle你需要将应用程序类型更改为Windows Application,就像stolsvik的答案中所述。无论如何,在我的情况下,默认情况下已启用此答案中提到的选项。 - TooTone
4
“Redirect All Output Window Text to the Immediate Window” 的确切意思是什么?如果需要,使用各种上下文来解释。我对“立即窗口”是什么感到困惑。这句话的意思是将所有输出窗口的文本重定向到立即窗口。立即窗口是一种在集成开发环境(IDE)中常用的窗口,可以显示代码执行期间的诊断信息,例如调试器所显示的变量值。通过将输出窗口的文本重定向到立即窗口,您可以直接在一个地方查看所有有关代码执行过程的信息,而无需在不同的窗口之间切换。 - Xonatron
20
问题明确要求为“控制台应用程序”,仅出于调试目的而将其更改为其他内容,其中我甚至无法使用**Console.ReadKey()**是完全荒谬的! - user585968
5
仅适用于Debug.WriteLine(),不适用于Console.WriteLine() :( - Y2i

56
Visual Studio选项对话框中->调试->勾选"将所有输出窗口文本重定向到即时窗口"。然后进入您的项目设置并将类型从"控制台应用程序"更改为"Windows应用程序"。此时,Visual Studio不再打开控制台窗口,并且输出被重定向到Visual Studio的输出窗口。但是,您无法进行任何"创造性"的操作,例如请求键盘或文本输入,或清除控制台-您将收到运行时异常。

39
我发现这个特别笨拙。我想知道,在VS中背后的逻辑是什么?所有现代IDE都应该能够让IDE内部的面板作为输入和输出控制台。(头皮发麻) - user4229245
16
这个问题明确要求是“控制台应用程序”,为了调试目的而将其更改为其他内容,甚至无法使用Console.ReadKey(),这简直荒谬! - user585968
1
不知道为什么,但当我试图将应用程序的“输出类型”从Windows应用程序还原为控制台时,当我运行应用程序时看不到控制台窗口。我能够调试应用程序,并且“Main”入口点也被触发了。我也按照本帖子中提到的选项设置进行了还原,但没有效果。我正在使用VS 2017社区版。 我失去了我的控制台窗口(哭泣)。 - RBT
3
就我所知,在VS 15.8.7中,唯一能够让控制台应用程序重定向输出的方法是将其更改为Windows应用程序,并且不勾选“Redirect”框。如果勾选该框,则无法显示输出结果。 - dpberry178

8

使用System.Diagnostics.Trace

根据您附加的侦听器,跟踪输出可以发送到调试窗口、控制台、文件、数据库或同时发送到所有位置。实现自己的TraceListener非常简单,因此可能性几乎是无限的。


1
是的,但我想知道的是是否有可能不必自己实现它就能够完成。 - devoured elysium
@devoured Trace类默认只输出到调试窗口。如果您想在其他地方查看输出,只需要附加额外的监听器(已经有几个可用)。 - Joel Coehoorn
2
我打开了调试选项对话框,并选择了“将所有输出窗口文本重定向到即时窗口”,以使跟踪输出进入即时窗口,这样它就不会与调试信息混在一起。 - Gabe
展示一个实际的解决方案/示例会更有用。 - StayOnTarget

4

大家好,是时候检查Visual Studio的最新版本了。之前对于一些人没有起作用的最常见解决方案现在可能已经有效。

在Visual Studio 2017(发布版本15.4.2及以上),转到工具 > 选项 > 调试 > 通用 > (复选框)将所有输出窗口文本重定向到立即窗口对我有用。

几点说明:

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

enter image description here

最好的祝愿!


4
在v15.9.4中测试,无法正常工作(至少对于控制台应用程序是如此)。 - bta
如果您可以分享您的配置截图,我可以尝试在我的环境中复制该问题。否则,如果问题已经解决,您可以分享您的解决方案。Visual Studio 15.9.4版本的发布说明可在https://learn.microsoft.com/en-us/visualstudio/releasenotes/vs2017-relnotes#-visual-studio-2017-version-1594找到,根据您的环境,您可能会发现一些有用的提示。Visual Studio 2017(输出窗口)文档:https://learn.microsoft.com/en-us/visualstudio/ide/reference/output-window?view=vs-2017 - kuzevni
3
请确保你要测试的项目是作为“控制台应用程序”创建的,而不是“Windows应用程序”。你的方法适用于Windows应用程序,但这不是原帖中指定的内容。 - bta
2
在VS2022中,这似乎无法用于控制台项目。 - Eru

3

如果您正在使用与Debug class中可用的Console.WriteLine(string)相同的方法,则在.net core中,您可以将以下行添加为program.cs文件中的第一行。

global using Console = System.Diagnostics.Debug;
using System.Diagnostics;

现在,项目中所有*.cs文件中的Console.WriteLine(string)都被执行为Debug.WriteLine(string)。在您想要显式使用console方法(例如Console.Readline())的地方,您必须将其替换为完全限定的类名System.Console.ReadLine()
现在,所有Console.WriteLine(string)的输出都可以在Visualstudio输出窗口中看到。您可以通过选择要在该窗口中查看的消息类型来进一步过滤output window中的噪音,如下所示: enter image description here

喜欢它!:) 非常感谢 - Eru

3
您可以尝试使用VSConsole,它允许您将其控制台窗口作为停靠面板集成到VisualStudio底部。要使用此功能,您需要:
  • 在VisualStudio中添加VSCodeExtension
  • 在项目中引用VSCode NugetPackage
  • 在*.cs文件中添加using Console = VSConsole.Console;作为命名空间引用。
  • 将输出类型从控制台应用程序更改为Windows应用程序,以隐藏运行控制台应用程序时弹出的主控制台窗口。
然后,您的应用程序将使用VSConsole.Console类,而不是System.Console类。

enter image description here


1
你可以创建一个包装应用程序,代替直接运行你的真实应用程序。这个包装应用程序可以监听标准输出并将所有内容重定向到 Trace。然后更改运行设置,启动你的包装器并传递真实应用程序的路径来运行。
如果调试器已经附加到包装器上,你也可以让包装器自动附加到新进程上。

1
一个对我有效的简单解决方案,用于处理控制台能力(ReadKey、带格式和 arg 的字符串等)并查看和保存输出:
我编写了一个 TextWriter,它可以写入到 Console 和 Trace,并将 Console.Out 替换为它。
如果你使用“对话框 - 调试 - 将所有输出窗口文本重定向到立即窗口”,你会在立即窗口中得到它,而且非常干净。
我的代码: 在我的代码开始处:
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);
    }
}

注意:我只覆盖了我需要的部分,如果你编写其他类型,你应该覆盖更多。

0

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

我的Web应用程序默认设置为“Class Library”输出类型。您不必更改它。我所要做的就是按照建议前往“工具”>“选项”>“调试”>将所有输出窗口文本重定向到“立即窗口”。然后我使用了上面Joel Coehoorn的System.Diagnostics.Trace建议。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接