Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重定向控制台。写入特定程序集_C#_.net_Logging_Reflection_Log4net - Fatal编程技术网

C# 重定向控制台。写入特定程序集

C# 重定向控制台。写入特定程序集,c#,.net,logging,reflection,log4net,C#,.net,Logging,Reflection,Log4net,在我的C#应用程序中,我通过反射加载另一个程序集 另一个程序集使用console.Write函数写入控制台 我只想将输出重定向到这个特定程序集的log4net appender。我希望所有其他程序集继续输出到控制台 我怎样才能做到这一点 Console类具有静态方法SetOut,该方法将输出重定向到StreamWriter对象 编写自己的StreamWriter扩展类,以重定向控制台输出(如果程序集与您所需的相同)。举个例子 公共类编写器:StreamWriter { 专用只读程序集\u程序集

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

另一个程序集使用console.Write函数写入控制台

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

我怎样才能做到这一点

  • Console
    类具有静态方法
    SetOut
    ,该方法将输出重定向到
    StreamWriter
    对象
  • 编写自己的
    StreamWriter
    扩展类,以重定向控制台输出(如果程序集与您所需的相同)。举个例子

    公共类编写器:StreamWriter { 专用只读程序集\u程序集

    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回答很好,我在考虑出发,但没有想到基于assembly.thx进行过滤,但是当我使用它来记录log4net时,它会创建一个异常:
    System.Threading.LockRecursionException:Recursive read lock acquisitions在此模式下不允许进行递归读取锁获取。
    您不接受答案有什么原因吗?(看起来答案涵盖了你的要求,那么请接受答案,这样问题就不会出现在“未回答”下。)@flindeberg:我还没有接受它,因为它不适用于我使用log4net编写日志的具体情况。它产生了许多异常。我很快会把细节作为对答案的评论。