簡體   English   中英

相當於PCL庫中的System.Diagnostics.Trace

[英]Equivalent for System.Diagnostics.Trace in PCL library

我很驚訝地發現System.Diagnostics.Trace未包含在可移植類庫配置文件中。 但是,System.Diagnostics.Debug可用。

我正在將庫移植到PCL,並且通常使用Trace語句為消費者提供額外的故障排除。 出於性能原因,我希望對程序集進行優化,因此我只在NuGet包中發布程序集的Release版本。

我的理解是System.Diagnostics.Debug的方法是有條件編譯的,因此僅在程序集包含DEBUG指令時才有用。

如果我更改我的代碼以使用System.Diagnostics.Debug然后在Release中編譯該方法是沒用的 - 在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-beta-23516

這是微軟用於跟蹤的新PCL。

到目前為止似乎處於測試階段......

您可以在單個C#文件中指定條件編譯指令。 因此,您可以圍繞Debug.Trace創建自己的包裝器,並為該代碼文件定義DEBUG指令,這將允許您從發行版DLL調用Debug.Trace。

我想最簡單的方法是在你的PCL中有一個簡單的事件,除了發布適當的eventargs(帶有要跟蹤的消息)之外什么都不做。 然后,平台代碼可以訂閱該事件,並根據該事件為您執行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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM