C# 与PCL库中的System.Diagnostics.Trace等效

C# 与PCL库中的System.Diagnostics.Trace等效,c#,portable-class-library,C#,Portable Class Library,当得知可移植类库配置文件中不包含System.Diagnostics.Trace时,我感到惊讶。但System.Diagnostics.Debug可用 我正在将一个库移植到PCL,并且通常使用跟踪语句为使用者提供额外的故障排除。出于性能原因,我希望对程序集进行优化,以便在NuGet软件包中只提供程序集的发布版本 我的理解是System.Diagnostics.Debug的方法是有条件编译的,因此只有在程序集包含Debug指令时才有用 如果我将代码更改为使用System.Diagnostics.D

当得知可移植类库配置文件中不包含System.Diagnostics.Trace时,我感到惊讶。但System.Diagnostics.Debug可用

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

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


如果我将代码更改为使用System.Diagnostics.Debug,然后在发行版中编译,那么这种方法是无用的——PCL中是否有System.Diagnostics.Trace的替代方法,或者我是否必须在发行版中包含Debug指令?或者我应该考虑另一种方法吗?

您可以在单个C#文件中指定条件编译指令。因此,您可以围绕Debug.Trace创建自己的包装器,并仅为该代码文件定义Debug指令,这将允许您从发布DLL调用Debug.Trace。

我认为最简单的方法是在PCL中有一个简单的事件,它只会发布适当的eventargs(带有要跟踪的消息)。然后,平台代码可以订阅该事件,并基于该事件为您执行Trace.Write/Trace.WriteLine。或者,您可以传递一个textwriter来进行日志记录。 一个粗略的例子:

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);
        }
    }
}
最后,要这样做:

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

有一个nuget包:

这是微软用于跟踪的新PCL


到目前为止似乎处于测试阶段…

跟踪关键取决于配置,不同目标的配置不同。只需购买一个与PCL兼容的日志库。例如,Metrologm。虽然我使用跟踪来支持日志记录尚不可用的条件,但我理解。我有一个日志的抽象,但如果这不起作用,我想提供一种更深入挖掘的方法。你能提供一个例子吗?我相信其他人会觉得很有帮助。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-这是一个完整的答案。你还想要什么?如果开发人员将来不能进行nuget搜索;那就没人能帮他了……那么这个方案是如何解决问题的呢。我想这不是你的包,但是Brad关于发布开源包的许多观点也适用于这里:。如果链接消失了,为什么还要有人去追踪它呢?这不是我的图书馆,而是微软的@埃斯奇奈德是正确的
System.Diagnostics.Tracing
是用于跟踪的可移植API,是.NET核心的一部分。最官方的消息来源是我们官方NuGet软件包的链接。它归微软所有,并得到充分支持@丹尼尔·普莱斯特的回答虽然正确,但现在已经被取代。
class MyAwesomeClass
{
    public MyAwesomeClass()
    {
        SomeClassInPCL.myTracer.MessageWritten += TraceMessageAction;
    }
    public void TraceMessageAction(object sender, PclTraceWriteEventArgs args)
    {
        Trace.WriteLine(args.WrittenMessage);
    }
}