Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在VisualStudio中使用控制台应用程序的输出而不是控制台_C#_Visual Studio_Console - Fatal编程技术网

C# 在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); 但这并不完全是一回事,因为在输出

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

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及更高版本)中,转到
工具>选项>调试>常规>(复选框)将所有输出窗口文本重定向到即时窗口
对我有效

几点注意:

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

  • 致以最良好的祝愿

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

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

  • 您可以为VisualStudio实现自己的调试引擎。调试引擎控件启动和调试应用程序。例如,您可以在docs.microsoft.com()上找到如何执行此操作
  • 使用C++的STD处理程序复制或使用控制台重定向表单应用程序。 如果需要打印到输出窗口,则需要使用Visual Studio extension SDK。 您可以在上找到的第二个变体的示例
  • 启动使用System.Diagnostics.Debug.WriteLine(用于打印到输出)的应用程序,然后启动子应用程序。在启动子级时,需要使用管道将stdout重定向到父级。你可以在MSDN上找到一个例子。但我认为这不是最好的办法
    如果您需要Console.WriteLine的输出,并且将所有输出窗口文本重定向到即时窗口不起作用,并且您需要知道集成测试资源管理器的测试输出,usin