.Net:子类化EventSource的子类

时间:2017-04-30 12:57:12

标签: c# etw eventsource

我有一个跨越很多项目的C#解决方案。我创建了一个继承自Systme.Diagnostics.Tracing.EventSource的跟踪类,名为MyCustomEventSource,它处理我的大部分跟踪事件。我想为每个项目创建此类的子类,以便我可以实现与特定项目相关的事件。

我也在编写一个ETW消费者,我可以轻松地从我系统的不同组件中收听事件。

但我的消费者无法正确识别事件:当我收听MyCustomEventSource时,每个事件的EventName字段设置为方法的名称,FormattedMessage设置为Message属性。例如:

[Event(1,
         Message = "The configuration parameter \"{0}\" was loaded with a value of {1}.",
         Level = EventLevel.Informational,
         Task = Tasks.Configuration,
         Keywords = Keywords.Diagnostics)]
    public void ConfigParameterLoaded(string name, string value)
    {
        WriteEvent(1, name, value);
    }

如果我听MyCustomEventSource,并且应用程序调用ConfigParameterLoaded,那么我得到一个名为ConfigParameterLoaded的事件,其FormattedMessage为“配置参数”x“加载了值y。”

这很好。

但是,如果我在MyCustomEventSource的子类上创建一个类似的方法并从该子类触发事件,我的EventName将始终为“EventSourceMessage”,并且FormattedMessage将始终为null。

我认为这可能是因为System.Diagnostics.Tracing.EventAttribute没有AttributeUsage(Inherited = true)。

我的问题是:有没有办法解决这个问题,并在从子类触发事件时获取正确的信息?

1 个答案:

答案 0 :(得分:4)

这不起作用,因为它是不允许的。您只能实现接口,并从不包含任何事件,任务,关键字的抽象类派生。阅读_EventSourceUsersGuide.docx

  

从EventSource NuGet包的RTM版本开始   现在可以指定正在实现的事件源类型   接口。   最初的设计决策(在NuGet包的beta版本中)明确禁止事件源类层次结构。   在新方法中,可以定义实用程序事件源类型:   从EventSource派生并保持的抽象事件源类   一组事件源共有的所有代码。这些抽象类   无法定义任何特定于ETW的元素:关键字,任务,操作码,   渠道,事件。他们只能提供派生所使用的方法   类。