6

現在、C# で Microsoft EventSources を試しています。1つの制限は次のとおりです

...ETW メソッドに渡される引数の数と型は、それが呼び出す WriteEvent オーバーロードに渡される型と正確に一致する必要があります。例えば:

[Event(2, Level = EventLevel.Informational)] 
public void Info(string message, int count) 
{
   base.WriteEvent(2, message, count); 
}

これは基本的に、EventSource クラスでよりリッチな API を作成することを制限します。これは基本的に、カスタム オブジェクトを受け取るメソッドを作成できず、メソッド本体内でそれを文字列 (または WriteEvent オーバーロードでサポートされている別の型) にシリアル化できることを意味します。

決定できる唯一のことは、メソッド名と、WriteEvent オーバーロードを反映するパラメーター名とカウントです。それとも私が間違っていますか?

4

2 に答える 2

12

これはmagicandre1981によって説明されました。ただし、記述した豊富な API を作成することを妨げられるわけではありません。解決策は、NonEventAttribute でマークされたオーバーロードを提供することです。例えば:

        [NonEvent]
        public void Warning(int tracerId, string message, params object[] args)
        {
            if (args != null)
                message = string.Format(message, args);
            Warning(tracerId, message);
        }

        [Event(EventIds.Warning, Level = EventLevel.Warning)]
        public void Warning(int tracerId, string message)
        {
            WriteEvent(EventIds.Warning, tracerId, message); 
        }
于 2015-01-08T23:41:28.053 に答える