我很惊讶地发现System.Diagnostics.Trace未包含在可移植类库配置文件中。虽然可以使用System.Diagnostics.Debug。
我将库移植到PCL并且通常使用Trace语句为消费者提供额外的故障排除。出于性能原因,我希望对程序集进行优化,因此我只在NuGet包中发布程序集的Release版本。
我的理解是System.Diagnostics.Debug的方法是有条件编译的,因此仅在程序集包含DEBUG指令时才有用。
如果我更改我的代码以使用System.Diagnostics.Debug然后在Release中编译该方法是无用的 - 在PCL中是否有System.Diagnostics.Trace的替代方法,或者我必须在我的发行版中包含DEBUG指令建立?或者我应该考虑另一种方法吗?
答案 0 :(得分:5)
有一个nuget包:
https://www.nuget.org/packages/System.Diagnostics.TraceSource
https://www.nuget.org/packages/System.Diagnostics.Tracing/4.0.21-beta-23516
这是微软用于追踪的新PCL。
到目前为止似乎处于测试阶段...
答案 1 :(得分:1)
您可以在单个C#文件中指定条件编译指令。因此,您可以围绕Debug.Trace创建自己的包装器,并为该代码文件定义DEBUG指令,这将允许您从发行版DLL调用Debug.Trace。
答案 2 :(得分:0)
我认为最简单的方法是在你的PCL中有一个简单的事件,除了发布适当的事件标记(带有要跟踪的消息)之外什么都不做。然后,平台代码可以订阅该事件,并根据该事件为您执行Trace.Write / Trace.WriteLine。或者您可以传递文本编写器来执行日志记录。 一个粗略的例子:
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);
}
}