В данном случае проблема заключается в использовании «Keywords = EventKeywords.All» в определении события. EventKeywords.All не предназначен для использования в событиях. Это означает «все 64 ключевых слова», что на самом деле незаконно, поскольку верхние биты зарезервированы. Значение EventKeywords.All определено для удобства при настройке прослушивателей событий или при проверке масок событий, но его не следует использовать при определении событий. В этом случае EventRegister не ожидал, что события будут использовать это значение для ключевых слов, поэтому возникло исключение. (У этого также были бы проблемы во время выполнения, поскольку EventSource жаловался бы на использование зарезервированных ключевых слов.)
Используете ли вы манифест, который создает EventRegister? Инструмент EventRegister анализирует вашу сборку и создает файл манифеста для каждого класса в вашей сборке, который наследуется от EventSource. Если вы не используете созданный им манифест, вам не нужно его запускать. Есть несколько вещей, которые могут запутать инструмент EventRegister и привести к его сбою.
Если вы не используете манифест, вы можете отключить EventRegister в своем файле .csproj или сделать так, чтобы ваш проект зависел от «EventSource Redistributable» вместо «EventSource», что даст вам доступ к DLL EventSource без добавления EventRegister в процесс сборки.
Также обратите внимание, что EventSource встроен в .NET 4.5 и более поздние версии — NuGet нужен только в том случае, если вам нужно запустить проект в более старой среде выполнения .NET. Встроенная версия также работает НАМНОГО быстрее (поскольку ей не нужно так сильно JIT - все встроенные библиотеки DLL времени выполнения JIT-обрабатываются во время установки).
И последнее замечание: .NET 4.6, NuGet 1.1.24 и более поздние версии EventSource имеют опцию «без манифеста», которая полностью исключает манифест. У них также есть метод eventSource.Write, который позволяет записывать события напрямую, без необходимости отслеживать идентификаторы событий. Итак, вместо:
[EventSource]
class MyEventSource : EventSource
{
[Event(...)]
public void MyEvent(...)
{
WriteEvent(...);
}
}
es = new MyEventSource();
es.MyEvent(23, "Hello");
Вы можете просто сделать это:
es = new EventSource("MyEventSourceName");
es.Write("MyEvent", new {
Number = 23,
Name = "Hello"
});
person
Doug Cook - MSFT
schedule
10.06.2016