Устранение рисков: реализации пользовательских IMessageFilter.PreFilterMessage

В приложениях Windows Forms, нацеленных на .NET Framework старше версии .NET Framework 4.6.1 включительно, пользовательская реализация IMessageFilter.PreFilterMessage может безопасно фильтровать сообщения при вызове метода Application.FilterMessage, если реализация IMessageFilter.PreFilterMessage:

  • выполняет одно или оба следующих действия:

    • добавляет фильтр сообщений путем вызова метода AddMessageFilter,

    • удаляет фильтр сообщений путем вызова метода RemoveMessageFilter, двумя компьютерами.

  • а также передает сообщения путем вызова метода Application.DoEvents.

Воздействие

Это изменение затрагивает только приложения Windows Forms, предназначенные для .NET Framework, начиная с версии .NET Framework 4.6.1.

В приложениях Windows Forms, которые предназначены для более ранних версий платформы .NET Framework, такие реализации в некоторых случаях создают исключение IndexOutOfRangeException при вызове метода Application.FilterMessage.

Исправление

Если это изменение нежелательно, приложения, предназначенные для платформа .NET Framework 4.6.1 или более поздней версии, могут отказаться от него, добавив следующий параметр конфигурации в <раздел среды выполнения> файла конфигурации приложения:

<runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Forms.DontSupportReentrantFilterMessage=true" />
</runtime>

Кроме того, приложения, предназначенные для предыдущих версий платформа .NET Framework, но выполняются в платформа .NET Framework 4.6.1 или более поздней версии, могут отказаться от этого поведения, добавив следующий параметр <конфигурации в раздел среды выполнения> файла конфигурации приложения:

<runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Forms.DontSupportReentrantFilterMessage=false" />
</runtime>

См. также