2015-09-18 10 views
0

У меня был некоторый код ETW в PCL, на который ссылаются и используется в приложении Windows 8.1, которое работает в течение нескольких месяцев. В частности, эта строка кода:ETW - Windows 8.1 - EventWrittenEventArgs Полезная нагрузка Отсутствующие данные

WriteEvent((int)errorId, message, (useSysLog ? sysLogErrorId : SysLogSeverity.NotSpecified)); 

посылала массив объектов в Payload собственности EventWrittenEventArgs в моей OnEventWritten функции моего EventListener.

Я хотел бы получить Payload с Count 2 и будет содержать string и SysLogSeverity экземпляр.

Я недавно обновил свою Visual Studio до 2015 года, и теперь мой Payload содержит только одно свойство - string. SysLogSeverity больше не проходит через OnEventWritten.

Могла ли модернизация VS2015 быть моей проблемой? Библиотека, в которой установлен код ETW, не изменилась при обновлении. Я проверил историю git моего проекта, и никакие версии сборки не изменились.

Я в недоумении, почему это происходит, и действительно оценил бы любые идеи относительно того, как отлаживать это/что может происходить.

Update:

Вот что мой вспомогательный метод выглядит, что это вызов WriteEvent функции:

[NonEvent] 
    private void _WriteEvent(int errorId, string message, SysLogSeverity sysLogSeverity) 
    { 
     if (_errorLevelsMap.ContainsKey((ErrorIds)errorId)) 
     { 
      sysLogSeverity = _errorLevelsMap[(ErrorIds)errorId]; 
     } 

     if (this.IsEnabled()) 
     { 
      WriteEvent((int)errorId, message, sysLogSeverity); 
     } 
    } 

Вот определение _errorLevelsMap:

private readonly Dictionary<ErrorIds, SysLogSeverity> _errorLevelsMap = new Dictionary<ErrorIds, SysLogSeverity> 
    { 
     { ErrorIds.Critical, SysLogSeverity.Critical }, 
     { ErrorIds.Error, SysLogSeverity.Error }, 
     { ErrorIds.Informational, SysLogSeverity.Informational }, 
     { ErrorIds.Verbose, SysLogSeverity.Debug }, 
     { ErrorIds.Warning, SysLogSeverity.Warning } 
    }; 

подписей матча и до сих пор , Payload содержит только message; а не sysLogErrorId.

Спасибо!

ответ

0

Необходимо иметь такое же количество параметров в методе, который вызывает WriteEvent, поскольку библиотека EventSource генерирует манифест на основе этих параметров, а не параметры, которые вы передаете в WriteEvent.

С _EventSourceUsersGuide.docx (страница 6):

Количество и типы аргументов, передаваемых методу ETW должен точно соответствовать типам передаваемых в WriteEvent перегружать он вызывает.

+0

О, мой. Это очень интересно. В настоящее время подписи не совпадают. Я попробую это немного. Знаете ли вы, что это новое требование? –

+0

Я никогда не использовал внутренний EcentSource .net. Я всегда использовал версию NuGet, и здесь она всегда требовалась. https://www.nuget.org/packages/Microsoft.Diagnostics.Tracing.EventSource – magicandre1981

+0

Я забыл упомянуть, что код ETW находится в PCL; Я не могу использовать пакет nuget. Я обновлю OP. –