3

我有一个跨越许多项目的 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 将始终为空。

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

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

4

1 回答 1

4

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

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

于 2017-04-30T17:18:54.997 回答