C# 捕获控制台输出以在VS中调试?

C# 捕获控制台输出以在VS中调试?,c#,visual-studio,debugging,C#,Visual Studio,Debugging,在VS的外部工具设置下,有一个“使用输出窗口”复选框,用于捕获工具命令行输出并将其转储到VS选项卡 问题是:当我点击F5时,我的程序能得到同样的处理吗 编辑:FWIW我在C#但是如果这对你的答案有影响,那么你的答案不太可能是我想要的 我想要的是使用输出重定向(“|”和“>”)在cmd提示符中使用的相同设备获取程序的输出流并将其传输到VS中的输出选项卡。System.Diagnostics.Debug.Writeline()或Trace.Writeline()您可以使用Systems.Diagno

在VS的外部工具设置下,有一个“使用输出窗口”复选框,用于捕获工具命令行输出并将其转储到VS选项卡

问题是:当我点击F5时,我的程序能得到同样的处理吗

编辑:FWIW我在C#但是如果这对你的答案有影响,那么你的答案不太可能是我想要的


我想要的是使用输出重定向(“|”和“>”)在cmd提示符中使用的相同设备获取程序的输出流并将其传输到VS中的输出选项卡。

System.Diagnostics.Debug.Writeline()或Trace.Writeline()

您可以使用Systems.Diagnostics.Trace类将输出写入输出窗口,而不是(或附加)控制台。它需要一点配置,但可以工作。这就是你想要的吗


您也可以根据添加自己的选项卡,但我从未尝试过。

我将在这里做一些假设。首先,我假设您谈论的是来自应用程序的printf输出(无论是来自控制台应用程序还是来自windows GUI应用程序)。我的第二个假设是C语言

据我所知,您不能将printf输出直接指向devstudio中的output窗口,无论如何也不能直接。[重点由OP添加]

也许有办法,但我不知道。但您可以做的一件事是将printf函数调用定向到您自己的例程,该例程将

  • 调用printf并打印字符串
  • 调用OuputDebugString()将字符串打印到输出窗口
  • 你可以做几件事来实现这个目标。首先是编写自己的printf函数,然后调用printf和outdebugstring()函数

    上面的代码大多未经测试,但它应该能让人理解这些概念


    如果您不是在C/C++中执行此操作,则此方法将不适用于您。:-)

    您应该能够捕获文本文件中的输出并使用它

    我手边没有VS,所以这是记忆中的:

    < LI>创建C++项目
  • 打开“项目设置、调试”选项卡
  • 启用托管调试
  • 编辑命令行以添加“
    >output.txt
  • 在调试器下运行程序
  • 如果事情按照我记忆中的方式进行,这将把STDOUT重定向到一个文件,即使您实际上并没有在CMD.EXE下运行

    (调试器有自己的重定向语法实现,虽然与cmd不同,但非常好。)


    现在,如果您在VS中打开此文件,您仍然可以在VS中看到输出,尽管与您希望的窗口不完全相同。

    也许这对您有用:在
    中的关闭
    }
    上设置断点,然后在关闭控制台窗口之前查看它。如果需要,你甚至可以从中复制文本

    在我用于开发的每台机器上,我都以某种方式配置控制台窗口,这恰好使这种方法工作得更好:

  • 运行cmd.exe
  • ALT-SPACE,D
  • 在选项中,启用快速编辑模式
  • 在布局中,将缓冲区高度设置为9999
  • 单击“确定”
  • 退出CMD窗口

  • 控制台可以将其输出重定向到任何textwriter。如果您实现了一个写入Diagnostics.Debug的textwriter,则所有设置都已完成

    这是一个向调试器写入的文本编写器

    using System.Diagnostics;
    using System.IO;
    using System.Text;
    
    namespace TestConsole
    {
        public class DebugTextWriter : TextWriter
        {
            public override Encoding Encoding
            {
                get { return Encoding.UTF8; }
            }
    
            //Required
            public override void Write(char value)
            {
                Debug.Write(value);
            }
    
            //Added for efficiency
            public override void Write(string value)
            {
                Debug.Write(value);
            }
    
            //Added for efficiency
            public override void WriteLine(string value)
            {
                Debug.WriteLine(value);
            }
        }
    }
    
    因为它使用Diagnostics.Debug,所以它将遵循编译器设置,以确定是否应该写入任何输出。此输出也可以在Sysinternals DebugView中看到

    以下是您如何使用它:

    using System;
    
    namespace TestConsole
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.SetOut(new DebugTextWriter());
                Console.WriteLine("This text goes to the Visual Studio output window.");
            }
        }
    }
    
    如果要在发布模式下编译时在Sysinternals DebugView中查看输出,可以使用写入outputdugstring API的TextWriter。它可能是这样的:

    using System.IO;
    using System.Runtime.InteropServices;
    using System.Text;
    
    namespace TestConsole
    {
        public class OutputDebugStringTextWriter : TextWriter
        {
            [DllImport("kernel32.dll")]
            static extern void OutputDebugString(string lpOutputString);
    
            public override Encoding Encoding
            {
                get { return Encoding.UTF8; }
            }
    
            //Required
            public override void Write(char value)
            {
                OutputDebugString(value.ToString());
            }
    
            //Added for efficiency
            public override void Write(string value)
            {
                OutputDebugString(value);
            }
    
            //Added for efficiency
            public override void WriteLine(string value)
            {
                OutputDebugString(value);
            }
        }
    }
    

    我正在寻找一些不需要修改输出代码就能工作的东西。这个链接也不是。第2段似乎介绍了如何使其工作,尽管使用OutputDebugString也可以很好地工作。+1用于控制台窗口的配置。我会将窗口大小的设置高度增加到50。
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Text;
    
    namespace TestConsole
    {
        public class OutputDebugStringTextWriter : TextWriter
        {
            [DllImport("kernel32.dll")]
            static extern void OutputDebugString(string lpOutputString);
    
            public override Encoding Encoding
            {
                get { return Encoding.UTF8; }
            }
    
            //Required
            public override void Write(char value)
            {
                OutputDebugString(value.ToString());
            }
    
            //Added for efficiency
            public override void Write(string value)
            {
                OutputDebugString(value);
            }
    
            //Added for efficiency
            public override void WriteLine(string value)
            {
                OutputDebugString(value);
            }
        }
    }