【问题标题】:Redirect console to Visual Studio debug output window in app.config将控制台重定向到 app.config 中的 Visual Studio 调试输出窗口
【发布时间】:2023-04-09 03:25:02
【问题描述】:

我想让我的Console.WriteLine() 命令与我的Debug.WriteLine() 语句一起出现在我的“输出”窗口中。我想我曾经想过如何做到这一点,但我不记得/在谷歌上找到如何再次做到这一点。我似乎记得在app.config 文件中可以做到这一点。

我找到了大量关于如何让控制台和调试语句出现在控制台输出中的说明,但没有找到如何让它们出现在“输出”窗口中的说明。

有可能吗?

【问题讨论】:

  • 经过一番努力,我找到了question with straight answer。在平视。唷。这是stolsvic 的答案:选项对话框 -> 调试 -> 选中“将所有输出窗口文本重定向到即时窗口”。该项目应该是“Windows 应用程序”类型而不是“控制台应用程序”

标签: visual-studio console-application


【解决方案1】:

基本上最简单的解决方案是这样的。

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

而且你必须在程序的初始化中加入这一行:

Console.SetOut(new ToDebugWriter());

【讨论】:

  • 该死!我终于可以在 Visual Studio 上查看我的 NHibernate 查询了!
  • 谢谢!为什么要打给base.WriteLine
  • @DGGenuine 对于这个解决方案,你不需要它。
  • @Avram 谢谢。不过我明白你的意思。由于ToDebugWriterStringWriter 的子类,因此不包括对base 的调用可能很危险,因为ToDebugWriter 应该像StringWriter 一样工作,包括收集书面文本以在ToString 方法中返回。
  • @DGGenuine 完全正确,只是最佳实践的一部分。
【解决方案2】:

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

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

我包含下面的代码是为了让任何有类似目标的人受益。 (为了完全安全,可以覆盖剩余的StringWriter.Write.WriteLine 方法。)我已经删除了对base 的调用,因为它们似乎是不必要的,我认为它们只是在@ 内部建立了一个大缓冲区987654336@(通常通过该类的.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);
        }
    }
}

【讨论】:

    【解决方案3】:

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

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

    使用 Visual Studio API 的方法可能是可行的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-25
      • 2020-11-09
      • 2011-02-10
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      相关资源
      最近更新 更多