2017-09-01 31 views
0

存儲的DateTime這是我當前的代碼:如何通過的EventSource WriteEventCore

[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下午五點00分00秒」爲startDateTime如果我提供startDateTime爲「8/30/2017 5:00:00 PM」該方法。這一年總是增加1600。

我試着提供8 as the size而不是sizeof(DateTime),我仍然得到相同的結果。如果我將日期更改爲字符串並將其作爲字符串傳遞給writeeventcore,那麼我會得到正確的日期值,如示例here中所示。我在這裏做錯了什麼?什麼是通過WriteEventCore傳遞DateTime的正確方法?

+0

舉起2個事件(1個開始和1個停止與正確的開始/停止操作碼)。所有的事件都有一個時間戳,你可以計算diff來獲得時間 – magicandre1981

+0

@ magicandre1981我的問題是將datetime對象存儲到EventData數組中。你是如何創建數據對象的?您爲datetime對象提供的大小和Datapointer值是多少?你的代碼中的 – Alfan

+0

我看到你[請問如何記錄事件的持續時間](https://stackoverflow.com/q/25066944/1466046)。但是,這是錯誤的方法失敗了,現在你試圖爲你的錯誤方法找到解決方法,而不是問真正的問題。這被稱爲[XY問題](https://meta.stackexchange.com/a/66378)。 – magicandre1981

回答

0

當您使用'EventData'時,您必須使用ETW期望的dateTime。這恰好是Windows FileTime格式(這是一個很長的時間從1600年的秒)

所以要傳遞一個DateTime到EventData,你必須做這樣的事情。

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