等效于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指令?或者我该考虑别的办法吗?
有一个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);
}
}