C# 在VisualStudio中使用控制台应用程序的输出而不是控制台
使用Eclipse在Java中执行控制台应用程序时,我看到输出被放在IDE本身的文本框中,而不是像VisualStudio中那样弹出控制台。这很方便,因为即使在程序退出后,我仍然可以很好地利用其中写入的文本,因为在我再次运行它之前它不会被擦除。使用VisualStudio可以实现类似的功能吗?我知道,而不是做C# 在VisualStudio中使用控制台应用程序的输出而不是控制台,c#,visual-studio,console,C#,Visual Studio,Console,使用Eclipse在Java中执行控制台应用程序时,我看到输出被放在IDE本身的文本框中,而不是像VisualStudio中那样弹出控制台。这很方便,因为即使在程序退出后,我仍然可以很好地利用其中写入的文本,因为在我再次运行它之前它不会被擦除。使用VisualStudio可以实现类似的功能吗?我知道,而不是做 System.Console.WriteLine(str); 我能行 System.Diagnostics.Debug.WriteLine(str); 但这并不完全是一回事,因为在输出
System.Console.WriteLine(str);
我能行
System.Diagnostics.Debug.WriteLine(str);
但这并不完全是一回事,因为在输出窗口中有很多“垃圾”,以及所有加载的符号等等
更好的是,当您运行应用程序时,是否可以在IDE中完成所有工作,而不是让控制台运行?使用
根据附加的侦听器的不同,跟踪输出可以一次转到调试窗口、控制台、文件、数据库或全部。实际上,实现自己的TraceListener非常简单,因此可能性是无穷的。您可以创建一个运行的包装应用程序,而不是直接运行真正的应用程序。包装器应用程序可以侦听stdout并将所有内容重定向到跟踪。然后更改运行设置以启动包装器,并传入要运行的实际应用程序的路径
如果将调试器附加到包装,您还可以让包装自动将调试器附加到新进程。在工具->Visual Studio选项对话框->调试->中选中“将所有输出窗口文本重定向到即时窗口”。在Visual Studio选项对话框->调试->中选中“将所有输出窗口文本重定向到即时窗口”。然后转到项目设置,并将类型从“控制台应用程序”更改为“Windows应用程序”。此时Visual Studio不再打开控制台窗口,并且输出重定向到Visual Studio中的输出窗口。但是,您无法执行任何“创造性”操作,例如请求键或文本输入,或清除控制台-您会遇到运行时异常。我知道这只是另一个答案,但我想我应该为新的Web开发人员写一些东西,他们可能会对“更改为Windows应用程序”部分感到困惑,因为我认为默认情况下,VisualStudio2013中的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、带格式的字符串和arg等),并查看和保存输出: 我编写TextWriter,它可以写入
控制台
和跟踪
,并用它替换控制台.Out
如果您使用Dialog->Debugging->选中“将所有输出窗口文本重定向到即时窗口”,您会在即时窗口中看到它,并且非常干净
我的代码:
在我的代码开头:
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的最新版本了。建议最多的解决方案以前对你们中的一些人不起作用,现在可能会起作用 在Visual Studio 2017(发行版15.4.2及更高版本)中,转到
工具>选项>调试>常规>(复选框)将所有输出窗口文本重定向到即时窗口
对我有效
几点注意:
致以最良好的祝愿 关于
System.Diagnostics.Debug
在输出窗口中产生大量“垃圾”:
您可以通过右键单击“输出”窗口来关闭该选项。例如,有一个项目“模块加载消息”需要禁用,还有一个项目“程序输出”需要保留。您有三种可能做到这一点,但这并不是微不足道的。 所有IDE的主要思想是它们都是子(调试)进程的父级。在这种情况下,可以使用标准的输入、输出和错误处理程序进行操作。因此IDE启动子应用程序并重定向到内部输出窗口。我知道还有一种可能性,但将来会有的
如果您需要Console.WriteLine的输出,并且将所有输出窗口文本重定向到即时窗口不起作用,并且您需要知道集成测试资源管理器的测试输出,usin