等效于PCL库中的System.Diagnostics.Trace

本文关键字:System Diagnostics Trace PCL | 更新日期: 2023-09-27 18:02:42

我惊讶地发现System.Diagnostics.Trace没有包含在可移植类库配置文件中。System.Diagnostics.Debug是可用的

我正在将一个库移植到PCL上,并且通常使用Trace语句为用户提供额外的故障排除。出于性能原因,我希望对程序集进行优化,因此我只在NuGet包中发布该程序集的发布版本。

我的理解是System.Diagnostics.Debug的方法是有条件编译的,因此只有当程序集包含DEBUG指令时才有用。

如果我改变我的代码使用System.Diagnostics.Debug,然后在发布中编译,这种方法是无用的——在PCL中是否有替代System.Diagnostics.Trace的方法,或者我必须在发布构建中包含DEBUG指令?或者我该考虑别的办法吗?

等效于PCL库中的System.Diagnostics.Trace

有一个nuget包:

https://www.nuget.org/packages/System.Diagnostics.TraceSource

https://www.nuget.org/packages/system.diagnostics.tracing/4.0.21 -β- 23516

这是微软新的用于跟踪的PCL。

可以在单个c#文件中指定条件编译指令。因此,可以围绕Debug创建自己的包装器。跟踪,并为该代码文件定义DEBUG指令,这将允许您调用DEBUG。

我想最简单的方法是在你的PCL中有一个简单的事件,它只会发布适当的事件参数(带有要跟踪的消息)。然后,平台代码可以订阅事件并执行Trace。写/跟踪。基于该事件为您编写eline。或者你可以传递一个文本书写器来做日志。一个粗略的例子:

public class PclTraceWriteEventArgs:EventArgs
{
    public PclTraceWriteEventArgs(string message)
    {
        WrittenMessage = message;
    }
    public string WrittenMessage { get; private set; }
}
public class PclTrace
{
    public TextWriter LogWriter { get; private set; }
    public PclTrace(TextWriter writer)
    {
        SetTracer(writer);
    }
    public PclTrace() { }
    public void SetTracer(TextWriter writer)
    {
        LogWriter = writer;
        if (LogWriter is StreamWriter)
            (LogWriter as StreamWriter).AutoFlush = true;
    }
    public async Task WriteAsync(string message)
    {
        if (LogWriter != null) await LogWriter.WriteAsync(message);
        OnMessageWritten(new PclTraceWriteEventArgs(message));
    }
    public async Task WriteLineAsync(string message)
    {
        if(LogWriter!=null) await LogWriter.WriteLineAsync(message);
        OnMessageWritten(new PclTraceWriteEventArgs(message));
    }
    public void Write(string message)
    {
        if (LogWriter != null) LogWriter.Write(message);
        OnMessageWritten(new PclTraceWriteEventArgs(message));
    }
    public void WriteLine(string message)
    {
        if (LogWriter != null) LogWriter.WriteLine(message);
        OnMessageWritten(new PclTraceWriteEventArgs(message));
    }
    public event Action<object, PclTraceWriteEventArgs> MessageWritten;
    protected virtual void OnMessageWritten(PclTraceWriteEventArgs args)
    {
        if (MessageWritten != null)
        {
            MessageWritten(this, args);
        }
    }
}

PCL中的类可以有一个(静态)变量,您可以在其中实例化PclTrace类,并且平台代码可以对该变量做出反应:

public static class SomeClassInPCL
{   
    public static PclTrace myTracer { get; private set; }
}

最后,这样做:

class MyAwesomeClass
{
    public MyAwesomeClass()
    {
        SomeClassInPCL.myTracer.MessageWritten += TraceMessageAction;
    }
    public void TraceMessageAction(object sender, PclTraceWriteEventArgs args)
    {
        Trace.WriteLine(args.WrittenMessage);
    }
}