На самом деле есть веская причина требовать, чтобы второй аргумент был производным от EventArgs
, если ваш полностью доверенный код содержит сторонний код как частично доверенный.
Поскольку обратный вызов делегату обработки событийвыполняется в контексте кода поднятия, а не стороннего кода, злонамеренный сторонний код может добавить привилегированную системную операцию в качестве обработчика событий и, таким образом, потенциально выполнить атаку на повышение привилегий, выполнив код на вашем полностьюдоверенный контекст, который не может быть запущен их частично доверенным контекстом.
Например, если вы объявите обработчик как тип int -> void
, тогда сторонний код может поставить в очередь YourEvent += Enviroment.Exit(-1)
и заставить вас непреднамеренно выйти из процесса,Это, очевидно, вызовет легко обнаруживаемую проблему, но существует гораздо больше вредоносных API, которые могут быть поставлены в очередь для выполнения других задач.
Если сигнатура (object, EventArgs) -> void
, то в платформе нет привилегированных операций.это может быть поставлено в очередь, потому что ни один из них не совместим с этой подписью.Это часть проверки кода безопасности в структуре, чтобы убедиться в этом (к сожалению, я не могу найти источник, где я это прочитал).
Так что в определенных обстоятельствах существуют обоснованные проблемы безопасности относительно того, почему вы должны использовать стандартный шаблон,Если вы на 100% уверены, что ваш код никогда не будет использоваться в этих обстоятельствах, тогда рекомендация о подписи события не так важна (кроме других разработчиков, которые думают о WTF), но если это так, то вам следует следовать ей.