CA2133: Delegati devono essere associati ai metodi con trasparenza consistente
TypeName |
DelegatesMustBindWithConsistentTransparency |
CheckId |
CA2133 |
Category |
Microsoft.Security |
Breaking Change |
Breaking |
Nota
Questo avviso è applicato solo al codice che sta eseguendo CoreCLR (la versione di CLR che è specifica delle applicazioni Web di Silverlight).
Causa
Questo avviso si attiva su un metodo che associa un delegato contrassegnato da SecurityCriticalAttribute a un metodo che è trasparente o contrassegnato con SecuritySafeCriticalAttribute. L'avviso genera anche un metodo che associa un delegato che è trasparente o critico per la sicurezza a un metodo critico.
Descrizione della regola
Tipi delegati e i metodi ai quali li associano devono disporre di trasparenza coerente. È possibile che i delegati trasparenti SafeCritical associno solo agli altri metodi trasparenti o SafeCritical. Analogamente, è possibile che delegati critici si associno solo ai metodi critici. Queste regole di associazione assicurano che l'unico codice che può richiamare un metodo tramite un delegato può inoltre aver richiamato direttamente lo stesso metodo. Ad esempio, le regole di associazione non consentono la chiamata direttamente da codice critico tramite un delegato trasparente.
Come correggere le violazioni
Per correggere una violazione di questo avviso, modificare la trasparenza del delegato o del metodo che vi associa in modo che la trasparenza dei due è equivalente.
Esclusione di avvisi
Non escludere un avviso da questa regola.
Codice
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() { }
}
}