将控制台重定向到app.config中的Visual Studio调试输出窗口

问题描述 投票:11回答:3

我想用我的Console.WriteLine()语句将我的Debug.WriteLine()命令显示在我的“输出”窗口中。我想我曾经想过如何做到这一点,但我不记得/在谷歌上找到如何再做一次。我似乎记得能够在app.config文件中执行此操作。

我找到了很多关于如何让控制台和调试语句出现在控制台输出中的说明,而不是如何让它们出现在“输出”窗口中。

可能吗?

visual-studio console-application
3个回答
19
投票

基本上最简单的解决方案看起来像这样。

public class ToDebugWriter : StringWriter
{
    public override void WriteLine(string value)
    {
        Debug.WriteLine(value);
        base.WriteLine(value);
    }
}

并且您必须将此行添加到程序的初始化中:

Console.SetOut(new ToDebugWriter());

3
投票

@Avram's answer为我工作,除了他的代码中的单个重载不是log4net的ConsoleAppender在我的系统上使用的那个。 (我对Console.SetOut感兴趣,以便log4net的ConsoleAppender输出到Visual Studio的“调试”输出窗格。)所以我覆盖所有StringWriterWriteWriteLine方法接受stringobjectchar[]等假设其中一个或多个是ConsoleAppender通过Console呼吁的。

这成功了,log4net日志现在出现在我的“Debug”窗格中。

我将下面的代码包括在内,以便为具有类似目标的任何人提供帮助。 (为了完全安全,可以覆盖剩余的StringWriter.Write.WriteLine方法。)我已经删除了对base的调用,因为它们似乎是不必要的,我认为它们只是在StringWriter中构建了一个大缓冲区(通常通过该类访问) .ToString()。)

namespace GeneralLibrary.Logging
{
    using System.Diagnostics;
    using System.IO;

    public class DebugWriter : StringWriter
    {
        public override void Write(string format, object arg0)
        {
            Debug.Write(string.Format(format, arg0));
        }

        public override void Write(string format, object arg0, object arg1)
        {
            Debug.Write(string.Format(format, arg0, arg1));
        }

        public override void Write(string format, object arg0, object arg1, object arg2)
        {
            Debug.Write(string.Format(format, arg0, arg1, arg2));
        }

        public override void Write(string format, params object[] arg)
        {
            Debug.Write(string.Format(format, arg));
        }

        public override void Write(object value)
        {
            Debug.Write(value);
        }

        public override void Write(string value)
        {
            Debug.Write(value);
        }

        public override void Write(char[] buffer)
        {
            Debug.Write(buffer);
        }

        public override void Write(char[] buffer, int index, int count)
        {
            Debug.Write(new string(buffer, index, count));
        }

        public override void WriteLine(string value)
        {
            Debug.WriteLine(value);
        }

        public override void WriteLine(object value)
        {
            Debug.WriteLine(value);
        }

        public override void WriteLine(string format, object arg0)
        {
            Debug.WriteLine(format, arg0);
        }

        public override void WriteLine(string format, object arg0, object arg1)
        {
            Debug.WriteLine(format, arg0, arg1);
        }

        public override void WriteLine(string format, object arg0, object arg1, object arg2)
        {
            Debug.WriteLine(format, arg0, arg1, arg2);
        }

        public override void WriteLine(string format, params object[] arg)
        {
            Debug.WriteLine(format, arg);
        }

        public override void WriteLine(char[] buffer)
        {
            Debug.WriteLine(buffer);
        }

        public override void WriteLine(char[] buffer, int index, int count)
        {
            Debug.WriteLine(new string(buffer, index, count));
        }

        public override void WriteLine()
        {
            Debug.WriteLine(string.Empty);
        }
    }
}

1
投票

如果您可以获取输出窗口的流,则可以使用Console.SetOut()重定向到它。然而,这种方法似乎不可能。

System.Debug输出到TraceListener的每个TraceListenerCollection。最初只注册了一个TraceListener,即DefaultTraceListener。它不使用流对象,而是使用本机方法进行输出。

使用Visual Studio API的方法可能就是这样。

© www.soinside.com 2019 - 2024. All rights reserved.