Поделиться через


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

TypeName

DelegatesMustBindWithConsistentTransparency

CheckId

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() { }
    }
}