C# 如何将用户定义的对象序列化到WriteEvent?

C# 如何将用户定义的对象序列化到WriteEvent?,c#,etw,etw-eventsource,C#,Etw,Etw Eventsource,从MSDN文档中,Write事件仅支持int和string参数类型。我想通过一个用户创建的ct来写事件,如何获得这个功能?实现此功能的正确序列化程序是什么?在Windows 10(也后端口到Win7/8.1)中,从.Net 4.6开始就支持: // define a ‘plain old data’ class [EventData] class SimpleData { public string Name { get; set; } publ

从MSDN文档中,Write事件仅支持int和string参数类型。我想通过一个用户创建的ct来写事件,如何获得这个功能?实现此功能的正确序列化程序是什么?

在Windows 10(也后端口到Win7/8.1)中,从.Net 4.6开始就支持:

// define a ‘plain old data’ class 
    [EventData]
    class SimpleData {
        public string Name { get; set; }
        public int Address { get; set; }
    }

    [EventSource(Name = "Samples-EventSourceDemos-RuntimeDemo")]
    public sealed class RuntimeDemoEventSource : EventSource
    {
        // define the singleton instance of the event source
        public static RuntimeDemoEventSource Log = new RuntimeDemoEventSource();

        // Rich payloads only work when the self-describing format 
        private RuntimeDemoEventSource() : base(EventSourceSettings.EtwSelfDescribingEventFormat) { }

        // define a new event. 
        public void LogSimpleData(string message, SimpleData data) { WriteEvent(1, message, data); }
    }

RuntimeDemoEventSource.Log.LogSimpleData(
        "testMessage", 
        new SimpleData() { Name = "aName", Address = 234 });

阅读博客和文档了解更多详细信息。

有几个选项:

  • 按照magicandre1981的建议使用。除非您必须使用.NET4.5、4.0甚至3.5,否则这是更好的选择
  • 在JSON或Bond等中手动序列化它们
  • 手动创建
    EventData
    结构并传递给(必须在
    safe
    内部)-当前使用此方法
  • 或者你可以举个例子。这是有道理的

Xml、Json、custom等。正确的序列化程序取决于您在数据写入时打算对其执行什么操作,以及您打算如何读取数据(人工或代码)。FWIW,Jon Wagner在创建/生成EventSourceRich有效负载数据时有一个错误。无法将有效负载数据传递给WriteEvent方法。它需要传递给EventSource的“public void Write(string eventName,T data);”方法。否则我会错过一些东西。