Condividi tramite


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