【问题标题】:.Net: subclassing subclasses of EventSource.Net:EventSource 的子类子类
【发布时间】:2017-04-30 12:57:11
【问题描述】:

我有一个跨越许多项目的 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)。

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

【问题讨论】:

  • 这是一个完全有效的问题。为什么有人投票结束这个?!

标签: c# etw eventsource


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-09-10
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    相关资源
    最近更新 更多