我正在使用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重载的参数名称和计数。 或者我错了吗?
答案 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重载的签名。