我在一个PCL中有一些ETW代码,它被引用,并在Windows8.1应用程序中使用,该应用程序已经工作了几个月。具体来说,这一行代码:
WriteEvent((int)errorId, message, (useSysLog ? sysLogErrorId : SysLogSeverity.NotSpecified));一直在向EventWrittenEventArgs的EventWrittenEventArgs的OnEventWritten函数的EventListener中的OnEventWritten属性发送对象数组。
我将得到一个Count为2的Count,它将包含一个string和一个SysLogSeverity实例。
我最近将我的Visual升级到2015年,现在,我的Payload只包含一个属性-- string。SysLogSeverity不再在OnEventWritten中运行。
升级到VS2015会是我的问题吗?在进行升级时,ETW代码所在的库没有改变。我已经检查了我的项目的git历史,没有任何程序集版本已经改变。
我不知道为什么会发生这种情况,我很想知道如何调试这个/可能发生的事情。
更新:
下面是我的助手方法,它调用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。
谢谢!
发布于 2015-09-18 16:50:46
在调用WriteEvent的方法中需要有相同数量的参数,因为EventSource库根据这些参数而不是传递给WriteEvent的参数生成清单。
来自_EventSourceUsersGuide.docx (第6页):
传递给ETW方法的参数的数量和类型必须与传递给它调用的WriteEvent重载的类型完全匹配。
https://stackoverflow.com/questions/32655753
复制相似问题