使用 Eclipse 在 Java 中执行控制台应用程序时,我看到输出被放在 IDE 本身的文本框中,而不是像在 Visual Studio 中那样弹出控制台。这很方便,因为即使在程序退出后,我仍然可以很好地利用其中写入的文本,因为在我再次运行它之前它不会被删除。是否可以使用 Visual Studio 实现类似的目标?我知道,而不是做
System.Console.WriteLine(str);
我可以
System.Diagnostics.Debug.WriteLine(str);
但它并不完全相同,因为在输出窗口中会出现很多“垃圾”,就像所有加载的符号等一样。
更好的是,当您运行应用程序时,是否可以在 IDE 本身中完成所有操作,而不是让控制台运行?
在工具 -> Visual Studio 选项对话框 -> 调试 -> 选中“将所有输出窗口文本重定向到即时窗口”。
在 Visual Studio 选项对话框 -> 调试 -> 选中“将所有输出窗口文本重定向到即时窗口”。然后转到您的项目设置并将类型从“控制台应用程序”更改为“Windows 应用程序”。此时,Visual Studio 不再打开控制台窗口,并且输出被重定向到 Visual Studio 中的输出窗口。但是,你不能做任何“创造性的”事情,比如请求键或文本输入,或者清除控制台——你会得到运行时异常。
Console.ReadKey()
简直太荒谬了!
Output type
从 Windows 应用程序恢复到控制台时,当我运行我的应用程序时,控制台窗口就看不到了。我能够调试应用程序,并且 Main
入口点也受到影响。我还恢复了这篇文章中提到的选项设置,但无济于事。我正在使用 VS 2017 社区版。 我失去了我的控制台窗口(抽泣)。
根据您附加的侦听器,跟踪输出可以转到调试窗口、控制台、文件、数据库或一次全部。可能性实际上是无穷无尽的,因为实现您自己的 TraceListener 非常简单。
伙计们,是时候检查 Visual Studio 的最新版本了。以前对你们中的一些人不起作用的最推荐的解决方案现在可能会起作用。
在 Visual Studio 2017(发布版本 15.4.2 及更高版本)中,转到 Tools > Options > Debugging > General > (Check Box) Redirect all Output Window text to Immediate Window
对我有用。
几点注意事项:
要查看即时窗口,请确保您处于调试模式。现在应该有 3 个其他调试工具可供您使用,即调用堆栈、断点和命令窗口,如下所示:
https://i.stack.imgur.com/8MO6S.png
最好的祝愿!
您可以创建一个您运行的包装应用程序,而不是直接运行您的真实应用程序。包装应用程序可以监听标准输出并将所有内容重定向到 Trace。然后更改运行设置以启动您的包装器并传入要运行的真实应用程序的路径。
如果调试器附加到包装器,您还可以让包装器自动将调试器附加到新进程。
一个对我有用的简单解决方案,可以使用控制台功能(ReadKey、带格式和 arg 的字符串等)并查看和保存输出:
我编写了写入 Console
和 Trace
的 TextWriter,并用它替换了 Console.Out
。
如果你使用 Dialog -> Debugging -> Check the "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);
}
}
注意:我只覆盖了我需要的东西,所以如果你编写其他类型,你应该覆盖更多
您可以尝试 VSConsole,它允许您将其控制台窗口集成到 VisualStudio 中,作为底部的停靠面板。要使用它,您必须
将 VSCodeExtension 添加到 VisualStudio
在您的项目中添加 VSCode NugetPackage 引用。
添加使用 Console = VSConsole.Console;作为 *.cs 文件中的命名空间引用
将输出类型从控制台应用程序更改为 Windows 应用程序以隐藏运行控制台应用程序时弹出的主控制台窗口。
然后,您的应用程序将使用 System.Console 类的 VSConsole.Console 类。
https://i.stack.imgur.com/9kEVf.gif
我知道这只是另一个答案,但我想我会为新的 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]);
}
}
}
关于 System.Diagnostics.Debug
在输出窗口中产生大量“垃圾”:您可以通过右键单击输出窗口来关闭它。例如,有一个项目“模块加载消息”要禁用,还有一个项目“程序输出”要保留。
你有三种可能性来做到这一点,但这并不是微不足道的。所有 IDE 的主要思想是它们都是子(调试)进程的父进程。在这种情况下,可以使用标准输入、输出和错误处理程序进行操作。因此 IDE 启动子应用程序并重定向到内部输出窗口。我知道另一种可能性,但它会在未来出现
您可以为 Visual Studio 实现自己的调试引擎。调试引擎控制应用程序的启动和调试。您可以在 docs.microsoft.com(Visual Studio 调试引擎)上找到如何执行此操作的示例,使用 c++ 的 std 处理程序的重复或使用 c# 的 Console.SetOut(TextWriter) 重定向表单应用程序。如果需要打印到输出窗口,则需要使用 Visual Studio 扩展 SDK。您可以在 Github 上找到第二个变体的示例。启动使用 System.Diagnostics.Debug.WriteLine 的应用程序(用于打印到输出),然后它将启动子应用程序。在启动孩子时,您需要使用管道将标准输出重定向到父级。你可以在 MSDN 上找到一个例子。但我认为这不是最好的方法。
如果您需要 Console.WriteLine 的输出,并且将所有输出窗口文本重定向到即时窗口不起作用,并且您需要知道集成测试资源管理器的测试输出,使用 NUnit.Framework 我们的问题已经在 VS 2017 解决:
https://i.stack.imgur.com/zGohE.png
https://i.stack.imgur.com/Yud0M.png
标准输出是我们想要的输出,由 Console.WriteLine 生成。
它适用于 VS 2017 中的控制台和 Windows 窗体应用程序,但仅适用于在调试或运行时为测试资源管理器生成的输出;无论如何,这是我对 Console.WriteLine 输出的主要需求。
如果您在 Console
上使用与 Debug class
中可用的相同方法,例如 Console.WriteLine(string)
,那么在 .net 核心中,您可以在 program.cs
文件中添加以下行作为您的第一行。
global using Console = System.Diagnostics.Debug;
using System.Diagnostics;
现在,您对 Console.WriteLine(string)
的所有调用都在项目中的所有 *.cs 文件中作为 Debug.WriteLine(string)
执行。在您想显式使用 Console.Readline()
等 console
方法的地方,您必须将其替换为完全限定的类名 System.Console.ReadLine()
。
https://i.stack.imgur.com/UQHeW.png