如何通过WriteEventCore在EventSource中存储DateTime

时间:2017-09-01 18:38:04

标签: c# etw etw-eventsource ms-tracing-eventsource

这是我目前的代码:

[NonEvent]
    unsafe void InsertViaWriteEventCore(
        int eventId,
        DateTime startDateTime,
        DateTime endDateTime)
    {
        const int eventDataCount = 2;
        {
            EventData* data = stackalloc EventData[eventDataCount];
            data->DataPointer = (IntPtr)(&startDateTime);
            data->Size = sizeof(DateTime);
            data[1].DataPointer = (IntPtr)(&endDateTime);
            data[1].Size = sizeof(DateTime);

            WriteEventCore(eventId, eventDataCount, data);
        }
    }

但最后,在生成的事件中,我看到" 8/30/3617 5:00:00 PM"如果我提供startDateTime作为" 8/30/2017 5:00:00 PM"方法。它总是在一年中增加1600个。

我尝试提供8 as the size而不是sizeof(DateTime),我仍然得到相同的结果。如果我将日期更改为字符串并传递给writeeventcore作为字符串,我会得到正确的日期值,如示例here中所示。我在这做错了什么?通过WriteEventCore传递DateTime的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

当您使用'EventData'时,您必须使用ETW对dateTime的期望。这恰好是Windows FileTime格式(这是一个长度,即从1600开始的秒数)

所以要将DateTime传递给EventData,你必须做这样的事情。

long startFileTime = startDateTime.ToFileTime();
data->DataPointer = (IntPtr)(& startFileTime);
data->Size = sizeof(long);