1

从 MSDN 文档中,Write-event 仅支持 int 和 string 参数类型。我想将用户创建的 ct 传递给 Write-event,如何获得此功能?实现此功能的正确序列化程序是什么?

4

2 回答 2

2

有几种选择:

  • 按照 magicandre1981 的建议使用新的 .NET 4.6 功能。这是最好的选择,除非您必须使用 .NET 4.5、4.0 甚至 3.5。
  • 以 JSON 或 Bond 等方式手动序列化它们
  • 手动创建EventData结构并传递给WriteEventCore(必须在里面unsafe)—— TPL目前使用这种方法。
  • 或者你可以这样。有一篇关于此的博客文章。
于 2015-12-18T21:04:18.083 回答
0

在 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 });

阅读博客和文档了解更多详情。

于 2015-12-09T05:08:04.807 回答