重定向控制台.写入特定程序集

本文关键字:程序集 控制台 重定向 | 更新日期: 2023-09-27 17:56:40

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

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

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

我怎样才能做到这一点?

重定向控制台.写入特定程序集

  1. Console类有静态方法SetOut,它将输出重定向到StreamWriter对象。
  2. 编写自己的 StreamWriter 扩展类以重定向控制台输出(如果程序集与所需相同)。只是为了举例。
    public class Writer : StreamWriter
    {
        private readonly Assembly _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();
        }
    }

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