在 Visual Studio 中而不是在控制台中输出控制台应用

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

System.Console.WriteLine(str);

我能做到

System.Diagnostics.Debug.WriteLine(str);

但这不完全是一回事,因为在“输出”窗口中会看到很多“垃圾”,以及所有加载的符号等等。

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

268579 次浏览

使用 System.Diagnostics.Trace

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

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

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

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

视觉工作室选项对话框-> 调试-> 检查“重定向所有输出窗口文本到立即窗口”。然后进入项目设置,将类型从“控制台应用”更改为“ Windows 应用程序”。此时,VisualStudio 不再打开控制台窗口,而是将输出重定向到 VisualStudio 中的 Output 窗口。但是,您不能做任何“创造性”的事情,比如请求键或文本输入,或清除控制台——您将得到运行时异常。

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

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

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

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

如果您的目标是调试,那么这是一种提供可重复调试场景的低成本方法。

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


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

一个简单的解决方案,适用于我,使用控制台能力(ReadKey,String with Format 和 arg 等) ,并查看和保存输出:

我写 TextWriter,写入 ConsoleTrace,并用它替换 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);
}
}

注意: 我覆盖的正是我需要的,所以如果你写其他类型,你应该覆盖更多

是时候检查 Visual Studio 的最新版本了,伙计们。以前对你们中的一些人不起作用的最有建议的解决方案现在可能起作用了。

在 VisualStudio2017(发布版本15.4.2及以上版本)中,使用 Tools > Options > Debugging > General > (Check Box) Redirect all Output Window text to Immediate Window对我来说很有效。

注释:

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

enter image description here

祝你好运!

关于 System.Diagnostics.Debug在输出窗口中产生大量“垃圾”的问题: 您可以通过在输出窗口中右键单击来关闭它。例如,有一个项目“ ModuleLoadMessages”要禁用,还有一个项目“ ProgramOutput”要保留。

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

  1. 您可以为 VisualStudio 实现自己的调试引擎。调试引擎控件的启动和应用程序的调试。这方面的例子你可以找到如何在 learn.microsoft.com 上做到这一点(VisualStudio 调试引擎)
  2. 对 c + + 使用复制的 std 处理程序重定向表单应用程序,或对 c # 使用 Console. SetOut (TextWriter)。 如果需要打印到输出窗口中,则需要使用 VisualStudio 扩展 SDK。 您可以在 Github上找到的第二个变体的示例。
  3. 启动使用 System 的应用程序。诊断。调试。然后启动子应用程序。在启动一个子元素时,您需要使用管道将 stdout 重定向到父元素。您可以在 MSDN 上找到一个示例。但我觉得这不是最好的办法。

如果您需要从控制台输出。你需要从集成测试资源管理器知道测试的输出,我们的问题已经是 在 VS 2017年解决:

例子取自 C # In Depth by Jon Skeet: Example taken from C# In Depth by Jon Skeet 这将在文本资源管理器上产生以下输出: Task Explorer

当我们点击右边“消耗时间”下面的“蓝色输出”,它会产生以下结果: Standard Output

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

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

您可以尝试 VSConsole,它允许您将其控制台窗口集成到 VisualStudio 中,作为底部的停靠面板。要使用这个,你必须

  • 代码扩展添加到 VisualStudio
  • 在项目中添加 VSCode NugetPackage引用。
  • 使用 Console = VSConsole. Console; 作为 * . cs 文件中的命名空间引用添加
  • 将“输出”类型从“控制台应用”更改为“ Windows 应用程序”,以隐藏运行控制台应用时弹出的主控制台窗口。

然后,应用程序将使用 VSConsole. Console 类,而不是 System.Console 类。

enter image description here

如果您在 Console上使用与 Debug class(如 Console.WriteLine(string))相同的方法,那么在。Net 核心,你可以添加下面的行作为你的第一行在 program.cs文件。

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

现在所有对 Console.WriteLine(string)的调用都作为 Debug.WriteLine(string)执行 * 。项目中的 cs 文件。在需要显式使用 console方法(如 Console.Readline())的地方,必须使用完全限定类名 System.Console.ReadLine()替换它。

现在,你所有的 Console.WriteLine(string)输出都可以在 Visualstudio 输出窗口中看到。您可以通过选择您希望在该窗口中看到的消息类型来进一步过滤掉 output window中的噪音,如下所示 enter image description here