CA2133: делегаты должны привязываться к методам с согласованной прозрачностью

Товар Значение
Идентификатор правила CA2133
Категория Microsoft.Security
Критическое изменение Критическое

Примечание.

Это предупреждение применяется только к коду, на котором выполняется CoreCLR (версия среды CLR, относящейся к веб-приложениям Silverlight).

Причина

Это предупреждение запускает метод, который привязывает делегат, помеченный SecurityCriticalAttribute методом, прозрачным или помеченным с помощью этого SecuritySafeCriticalAttributeметода. Предупреждение также запускает метод, который привязывает прозрачный или безопасный делегат к критическому методу.

Примечание.

Это правило устарело. Дополнительные сведения см. в разделе "Устаревшие правила".

Описание правила

Типы делегатов и методы, к которым они привязываются, должны иметь согласованную прозрачность. Прозрачные и безопасные делегаты могут привязаться только к другим прозрачным или безопасным критически важным методам. Аналогичным образом критически важные делегаты могут привязаться только к критическим методам. Эти правила привязки гарантируют, что единственный код, который может вызвать метод с помощью делегата, также мог вызвать тот же метод напрямую. Например, правила привязки запрещают прозрачному коду вызывать критически важный код непосредственно через прозрачный делегат.

Устранение нарушений

Чтобы устранить нарушение этого предупреждения, измените прозрачность делегата или метода, который он привязывает таким образом, чтобы прозрачность этих двух была эквивалентна.

Когда лучше отключить предупреждения

Для этого правила отключать вывод предупреждений не следует.

Код

using System;
using System.Security;

namespace TransparencyWarningsDemo
{

    public delegate void TransparentDelegate();

    [SecurityCritical]
    public delegate void CriticalDelegate();

    public class TransparentType
    {
        void DelegateBinder()
        {
            // CA2133 violation - binding a transparent delegate to a critical method
            TransparentDelegate td = new TransparentDelegate(CriticalTarget);

            // CA2133 violation - binding a critical delegate to a transparent method
            CriticalDelegate cd = new CriticalDelegate(TransparentTarget);
        }

        [SecurityCritical]
        void CriticalTarget() { }

        void TransparentTarget() { }
    }
}