【问题标题】:Redirect Console.Write of specific assembly重定向 Console.Write 特定程序集
【发布时间】:2014-04-03 15:37:59
【问题描述】:

在我的 C# 应用程序中,我正在通过反射加载另一个程序集。

这个其他程序集使用 Console.Write 函数写入控制台。

我只想将输出重定向到这个特定程序集的 log4net 附加程序。我希望所有其他程序集继续输出到控制台。

我怎样才能做到这一点?

【问题讨论】:

  • 您没有接受答案有什么原因吗? (看起来答案涵盖了您的要求,那么请接受答案,这样问题就不会出现在“未回答”下。)
  • @flindeberg:我还没有接受它,因为它不适用于我的特定情况,我使用 log4net 来编写日志。它会产生很多异常。我会尽快将详细信息作为对答案的评论。

标签: c# .net logging reflection log4net


【解决方案1】:
  1. Console 类有静态方法SetOut,它将输出重定向到StreamWriter 对象。
  2. 编写您自己的StreamWriter 扩展类来重定向控制台输出,如果汇编与您想要的相同。仅举例。

    公共类 Writer : StreamWriter { 私有只读程序集_assembly;

    private readonly StreamWriter _stdout;
    
    public Writer(Assembly assembly)
        : base(Console.OpenStandardOutput())
    {
        _assembly = assembly;
        _stdout = new StreamWriter(Console.OpenStandardOutput());
    }
    
    public override void Write(string value)
    {
        var st = new StackTrace();
        var curent = st.GetFrames();
        foreach (var frame in curent)
        {
            if (frame.GetMethod().Module.Assembly == _assembly)
            {
                _stdout.Write("Redirected: " + value);
                _stdout.Flush();
                return;
            }
        }
    
        base.Write(value);
            this.Flush();
    }
    

    }

在某些情况下,例如一个程序集调用方法,可能会从另一个程序集写入控制台。我不知道如何预测这种行为。

【讨论】:

  • +1 很好的答案,我在考虑 SetOut,但没有想到要根据程序集进行过滤。
  • thx,但是当我使用它使用 log4net 登录时,它会创建此异常:System.Threading.LockRecursionException: Recursive read lock acquisitions not allowed in this mode.
猜你喜欢
  • 2012-04-27
  • 2017-02-16
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 2021-10-01
  • 2021-10-18
  • 2014-08-02
  • 1970-01-01
相关资源
最近更新 更多