为什么限制参数类型和对EventSource方法的计数

时间:2014-11-21 10:15:54

标签: c# tracing etw-eventsource

我正在使用C#中的Microsoft EventSources进行实验。 一个限制是以下

  

...传递给ETW方法的参数的数量和类型必须   完全匹配传递给它调用的WriteEvent重载的类型。   例如:

[Event(2, Level = EventLevel.Informational)] 
public void Info(string message, int count) 
{
   base.WriteEvent(2, message, count); 
}

这基本上限制了您在EventSource类中编写更丰富的API。这基本上意味着你不能创建一个接收自定义对象的方法,并且在方法体中你可以将它序列化为一个字符串(或WriteEvent重载支持的另一种类型)。

您唯一能决定的是方法名称以及反映WriteEvent重载的参数名称和计数。 或者我错了吗?

2 个答案:

答案 0 :(得分:11)

magicandre1981对此进行了解释。但是,您无法编写您描述的丰富API。解决方案是提供标有NonEventAttribute的重载。例如:

        [NonEvent]
        public void Warning(int tracerId, string message, params object[] args)
        {
            if (args != null)
                message = string.Format(message, args);
            Warning(tracerId, message);
        }

        [Event(EventIds.Warning, Level = EventLevel.Warning)]
        public void Warning(int tracerId, string message)
        {
            WriteEvent(EventIds.Warning, tracerId, message); 
        }

答案 1 :(得分:3)

这是构建清单文件所必需的。 _EventSourceUsersGuide.docx解释了它:

  

事件方法必须完全匹配它调用的WriteEvent重载的类型,特别是你应该避免隐式标量转换;它们是危险的因为清单是根据ETW事件方法的签名生成的,但传递给ETW的值是基于WriteEvent重载的签名。

相关问题