在Visual Studio中有控制台应用程序而不是控制台的输出


120

当使用Eclipse在Java中制作控制台应用程序时,我看到输出被放在IDE本身的文本框中,而不是像Visual Studio那样弹出控制台。这很方便,因为即使程序退出后,我仍然可以充分利用其中编写的文本,因为直到再次运行它才会被擦除。使用Visual Studio可以实现类似的功能吗?我知道,除了做

System.Console.WriteLine(str);

我可以

System.Diagnostics.Debug.WriteLine(str);

但这不是完全一样的事情,因为在“输出”窗口中会出现很多“垃圾”,包括所有已加载的符号等。

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


您正在使用哪个版本的VS?
加布

您有“测试结果”窗格吗?
加布

我从没注意到。我会检查的。我应该吃吗?
吞噬了极乐世界

Answers:


52

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


68
我已经选中了此复选框,但是在“输出”窗口(“调试”,“测试”,“构建” ..)或“即时窗口”中仍然没有弹出控制台。
GuiSim 2012年

6
@EvenLisle,您需要将应用程序类型更改为Windows应用程序,如stolsvik的答案中所述。在任何情况下,默认情况下,此答案中提到的选项都是打开的。
TooTone 2014年

3
“将所有输出窗口文本重定向到立即窗口”究竟是什么意思?如果需要,请使用各种上下文。我对“即时窗口”感到困惑。
Xonatron

11
@TooTone这个问题清楚地指出了一个“控制台应用程序”,并将其更改为其他目的只是为了调试,而我什至无法Console.ReadKey()简直太荒谬了!
MickyD

1
仅适用于Debug.WriteLine(),不适用于Console.WriteLine():(
Y2i

45

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


25
我觉得这特别笨拙。我想知道VS背后的原理是什么?所有现代IDE都应该具有使IDE内的面板充当输入和输出控制台的功能。(抓头)

12
这个问题清楚地表明需要“控制台应用程序”并将其更改为其他目的,仅用于调试目的,我什至不能Console.ReadKey()直截了当!
MickyD

不知道为什么,但是当我尝试将Output type我的应用程序从Windows应用程序还原回控制台时,控制台窗口在我运行应用程序时看不到。我能够调试该应用程序,并且Main入口点也受到了攻击。我还还原了本文中提到的选项设置,但无济于事。我正在使用VS 2017社区版。我丢失了控制台窗口(吸水)。
RBT

3
对于它的价值,在VS 15.8.7中,我可以使输出重定向到控制台应用程序的唯一方法是将其更改为Windows应用程序,并取消选中“重定向”框。如果我选中此框,则不会显示输出。
dpberry178 '18

6

System.Diagnostics.Trace

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


是的,但是我想知道的是,是否有可能只做一次而不必自己实现。
吞噬了极乐世界

@devoured默认情况下,Trace类仅输出到调试窗口。如果您还想在其他地方查看输出,则只需附加额外的侦听器(可以使用几个已经编写的侦听器)。
乔尔·科洪

1
我转到“调试选项”对话框,然后选择“将所有输出窗口文本重定向到立即窗口”,以使“跟踪”输出转到“立即窗口”,这样就不会与调试废话混为一谈。
加布

2

是时候检查一下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中进行了测试,无法正常运行(至少不适用于控制台应用程序)。
bta

嗯 如果您可以共享您的配置的屏幕截图,那么我可以尝试再次复制该问题。否则,如果解决了,您可以共享您的解决方案。可以在docs.microsoft.com/en-us/visualstudio/releasenotes/…上找到Visual Studio 15.9.4的发行说明,您可能会根据环境找到一些有用的提示。 Visual Studio 2017(输出窗口)文档docs.microsoft.com/zh-cn/visualstudio/ide/reference/…–
kuzevni

仔细检查您要测试的项目是否被创建为“控制台应用程序”,而不是“ Windows应用程序”。您的方法适用于Windows应用程序,但这不是OP指定的。
bta

1

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

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


0

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

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


0

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

我写的TextWriter是写ConsoleTrace并更换Console.Out它。

如果使用对话框->调试->选中“将所有输出窗口文本重定向到立即窗口”,则可以在立即窗口中获得它,并且非常干净。

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

   Console.SetOut(new TextHelper());

和班级:

public class TextHelper : TextWriter
    {
        TextWriter console;

        public TextHelper() {
            console = Console.Out;
        }

        public override Encoding Encoding { get { return 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

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


0

您可以通过三种方式来做到这一点,但这并非无关紧要。所有IDE的主要思想是它们都是子(调试)进程的父级。在这种情况下,可以使用标准输入,输出和错误处理程序进行操作。因此,IDE启动子应用程序,然后重定向到内部输出窗口。我知道另一种可能性,但将来会出现

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

0

如果您需要从Console.WriteLine输出,并且 无法将所有输出窗口文本重定向到立即窗口,并且您需要使用NUnit.Framework从集成测试资源管理器中了解测试的输出,我们的问题已在VS 2017中解决

Jon Skeet摘自C#In Depth的示例: Jon Skeet摘自C#Depth 这将在Text Explorer中产生以下输出: 任务浏览器

当我们单击“蓝色输出”时,在右侧的“经过的时间”下,它将产生以下内容: 标准输出

标准输出是我们所需的输出,由Console.WriteLine产生。

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


-1

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

您不能提供输入,但是可以轻松地提供几个带有不同命令行参数的测试,每个测试都收集输出。

如果您的目标是调试,那么这是提供可重复调试方案的省力方法。

namespace Commandline.Test
{
    using Microsoft.VisualStudio.TestTools.UnitTesting;

    [TestClass]
    public class CommandlineTests
    {
        [TestMethod]
        public void RunNoArguments()
        {
            Commandline.Program.Main(new string[0]);
        }
    }
}

-7

步骤1:在解决方案资源管理器中右键单击项目名称,然后将输出类型设置为Window Application

步骤2:调试->选项..-->调试(扩展)->常规->将所有输出窗口文本重定向到立即窗口


3
这个答案以前已经给出过三遍了。它没有解决所问的问题。
克莱
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.