在VS的外部工具设置下,有一个“使用输出窗口”复选框,用于捕获工具命令行输出并将其转储到VS选项卡。
问题是:当我点击F5时,我可以为我的程序获得相同的处理吗?
编辑: FWIW我在C#中,但如果这对您的答案有所影响,那么您的答案就不太可能是我正在寻找的。 p>
我想要的是获取程序的输出流并使用输出重定向('|'和'>')在cmd提示符中使用的相同设备将其传输到VS中的输出选项卡。
答案 0 :(得分:3)
您应该能够在文本文件中捕获输出并使用它。
我没有VS方便,所以这是来自记忆:
> output.txt
”如果事情按我记忆的方式工作,这会将STDOUT重定向到一个文件,即使你实际上并没有在CMD.EXE下运行。
(调试器有自己的重定向语法实现,与cmd不是100%相同,但它非常好。)
现在,如果你在VS中打开这个文件,你仍然可以看到VS中的输出,虽然不是你想要的完全相同的窗口。
答案 1 :(得分:3)
控制台可以将其输出重定向到任何文本编写器。如果您实现了写入Diagnostics.Debug的文本编写器,那么您已经完成了设置。
这是一个写入调试器的文本编写器。
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中查看输出,可以使用写入OutputDebugString 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 :(得分:1)
我将在这里做一些假设。首先,我假设您正在讨论应用程序的printf输出(无论是来自控制台应用程序还是来自Windows GUI应用程序)。我的第二个假设是C语言。
据我所知,你无法将printf输出定向到开发工作室的输出窗口,而不是直接。 [OP强调添加]
可能有办法,但我不知道。你可以做的一件事就是将printf函数调用指向你自己的例程
你可以做几件事来实现这个目标。首先是编写自己的printf函数,然后调用printf和OuputDebugString()
void my_printf(const char *format, ...)
{
char buf[2048];
// get the arg list and format it into a string
va_start(arglist, format);
vsprintf_s(buf, 2048, format, arglist);
va_end(arglist);
vprintf_s(buf); // prints to the standard output stream
OutputDebugString(buf); // prints to the output window
}
上面的代码大部分都是未经测试的,但是它应该得到概念。
如果你不是在C / C ++中这样做,那么这个方法对你不起作用。 :-)
答案 3 :(得分:1)
也许这对您有用:在}
中的关闭Main
上设置断点,然后在关闭之前查看控制台窗口。如果需要,您甚至可以将文本复制出来。
在我用于开发的每台机器上,我以某种方式配置我的控制台窗口,这恰好使这种方法更好:
答案 4 :(得分:0)
System.Diagnostics.Debug.Writeline()或Trace.Writeline()
答案 5 :(得分:0)
您可以使用Systems.Diagnostics.Trace类将输出写入“输出”窗口,而不是(或除控制台)之外。它需要一些配置,但它的工作原理。这是你想要的吗?
您还可以按this article添加自己的标签,但我从未尝试过。