[Part 6] Logging with Universal Apps

2016-03-22

Code

1 minute

Check out the codes in GitHub.

Basically, 2 steps:

Create a C++ Windows Runtime Component (dll) that will use the ETW header file. Reference the WinRT DLL to C# project.

WinRT DLL

My logging class looks like this:

public ref class TraceCore sealed
{
private:
    TraceCore();
    ~TraceCore();

    static TraceCore^ m_Instance;

public:
    static property TraceCore^ Instance
    {
        TraceCore^ get()
        {
            if (m_Instance == nullptr)
            {
                m_Instance = ref new TraceCore();
            }

            return m_Instance;
        }
    }

    void Verbose(Platform::String^ mod, Platform::String^ file, Platform::String^ func, Platform::String^ m);
};

And heres the implementation:

#include "pch.h"
#include "TraceCore.h"

using namespace LibRTWrapperETW;
using namespace Platform;

#include "jytrace.h"

TraceCore^ TraceCore::m_Instance = nullptr;

TraceCore::TraceCore()
{
    EventRegisterJyTrace();
}

TraceCore::~TraceCore()
{
    EventUnregisterJyTrace();
}

void TraceCore::Verbose(String^ mod, String^ file, String^ func, String^ m)
{
    EventWriteSimple(mod->Data(), file->Data(), func->Data(), L"Trace", m->Data());
}

Wrapper Class

Just like in part 5, I wrapped the C++ bits to a C# class so I can use the CallerMemberName and CallerFilePath attributes:

public static class TraceCoreWrapper
{
    public static void VerboseCore(
        string m,
        [CallerMemberName] string memberName = "?",
        [CallerFilePath] string srcFile = "?",
        [CallerLineNumber] int srcNum = 0)
    {
        TraceCore.Instance.Verbose("CORE_RT [" + Environment.CurrentManagedThreadId + "]", Path.GetFileName(srcFile), memberName, m);
    }
}

And finally, the actual logging in C#:

TraceCoreWrapper.VerboseCore("Hello from UApp (CS) world!");