CA2133: Los delegados deben enlazarse a métodos con una transparencia coherente
Nombre de tipo |
DelegatesMustBindWithConsistentTransparency |
Identificador de comprobación |
CA2133 |
Categoría |
Microsoft.Security |
Cambio problemático |
Sí |
[!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() { }
}
}