在我的 C# 应用程序中,我正在通过反射加载另一个程序集。
此其他程序集使用 Console.Write 函数写入控制台。
我想将输出重定向到此特定程序集的 log4net 追加器。我希望所有其他程序集继续输出到控制台。
我怎样才能做到这一点?
-
Console
类有静态方法SetOut
,它将输出重定向到StreamWriter
对象。 - 编写自己的
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();
}
}
在某些情况下,例如一个程序集调用方法,可能会从另一个程序集写入控制台。我不知道如何预测这种行为。