Compartir a través de


CA2133: Los delegados deben enlazarse a métodos con una transparencia coherente

TypeName

DelegatesMustBindWithConsistentTransparency

Identificador de comprobación

CA2133

Categoría

Microsoft.Security

Cambio problemático

Problemático

[!NOTA]

Esta advertencia solo se aplica al código que está ejecutando CoreCLR (la versión de CLR que es específica de las aplicaciones web de Silverlight).

Motivo

Esta advertencia se desencadena en un método que enlaza un delegado que está marcado con SecurityCriticalAttribute a un método que es transparente o que está marcado con SecuritySafeCriticalAttribute.La advertencia también desencadena un método que enlaza un delegado que es transparente o crítico para la seguridad a un método crítico.

Descripción de la regla

Los tipos delegados y los métodos a los que están enlazados deben tener una transparencia coherente.Los delegados transparentes y críticos para la seguridad y disponible desde código transparente solo pueden enlazarse a métodos transparentes o críticos para la seguridad y disponible desde código transparente.De forma similar, los delegados críticos para la seguridad solo pueden enlazarse a métodos críticos para la seguridad.Estas reglas de enlace aseguran que el único código que puede invocar un método a través de un delegado también pudiera haber invocado directamente el mismo método.Por ejemplo, las reglas de enlace evitan que el código transparente llame directamente al código crítico a través de un delegado transparente.

Cómo corregir infracciones

Para corregir una infracción de esta advertencia, cambie la transparencia del delegado o del método al que enlaza para que la transparencia de los dos sea equivalente.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Código

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