Почему ограничение на тип параметра и количество методов EventSource

В данный момент я экспериментирую с Microsoft EventSources на С#. Одно ограничение заключается в следующем

... Количество и типы аргументов, передаваемых методу ETW, должны точно соответствовать типам, передаваемым вызываемой им перегрузке WriteEvent. Например:

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

Это в основном ограничивает вас написанием более богатого API в классе EventSource. В основном это означает, что вы не можете создать метод, который получает пользовательский объект, и в теле метода вы можете сериализовать его в строку (или другой тип, поддерживаемый перегрузками WriteEvent).

Единственное, что вы можете решить, это имя метода, имена параметров и количество, которые отражают перегрузки WriteEvent. Или я ошибаюсь?


person rudimenter    schedule 21.11.2014    source источник
comment
Возможно, стоит попробовать более позднюю версию EventSource, особенно поддержку расширенных данных: blogs.msdn.microsoft.com/vancem/2015/09/20/   -  person cristobalito    schedule 19.01.2018


Ответы (2)


Это необходимо для создания файла манифеста. The_EventSourceUsersGuide.docx объясняет это:

Методы событий должны точно соответствовать типам вызываемой перегрузки WriteEvent, в частности, следует избегать неявных скалярных преобразований; они опасны, поскольку манифест создается на основе сигнатуры метода события ETW, но значения, передаваемые в ETW, основаны на сигнатуре перегрузки WriteEvent.

person magicandre1981    schedule 21.11.2014

Это объяснил 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); 
        }
person Frank Hileman    schedule 08.01.2015
comment
Спасибо, что помогли мне решить плохой пример в Руководстве разработчика по корпоративной библиотеке Microsoft — 2-е издание на странице 130. Или, может быть, я что-то упустил в их объяснении. - person LMA1980; 12.09.2015