6

我目前正在 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 重载的计数。还是我错了?

4

2 回答 2

12

这是由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); 
        }
于 2015-01-08T23:41:28.053 回答
4

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

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

于 2014-11-21T17:07:44.027 回答