我在PCL中有一些ETW代码被引用并用于已经工作了几个月的Windows 8.1应用程序中。具体来说,这行代码:
WriteEvent((int)errorId, message, (useSysLog ? sysLogErrorId : SysLogSeverity.NotSpecified));
一直在我的Payload
的{{1}}函数中向EventWrittenEventArgs
的{{1}}属性发送一个对象数组。
我会得到OnEventWritten
EventListener
为2,它会包含Payload
和Count
个实例。
我最近将Visual Studio升级到2015,现在,我的string
只包含一个属性 - SysLogSeverity
。 Payload
中不再显示string
。
升级到VS2015可能是我的问题吗?升级发生时,ETW代码所在的库没有改变。我检查了项目的git历史记录,没有任何程序集版本发生变化。
我为何会发生这种情况感到茫然,并且非常感谢有关如何调试此事件/可能发生的事情的任何想法。
更新
这是我的帮助方法看起来正在调用SysLogSeverity
函数:
OnEventWritten
这是_errorLevelsMap的定义:
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);
}
}
仅包含 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
。
谢谢!
答案 0 :(得分:0)
您需要在调用WriteEvent
的方法中使用相同数量的参数,因为EventSource库会根据这些参数生成清单,而不是您传递给WriteEvent
的参数。
来自_EventSourceUsersGuide.docx
(第6页):
传递给ETW方法的参数的数量和类型必须 完全匹配传递给它调用的WriteEvent重载的类型。