CA2133: Delegados devem ligar para métodos com transparência consistente

TypeName

DelegatesMustBindWithConsistentTransparency

CheckId

CA2133

<strong>Categoria</strong>

Microsoft.Security

Alteração significativa

Quebrando

ObservaçãoObservação

Este aviso só é aplicado ao código que está executando o CoreCLR (a versão do CLR é específico para aplicativos da Web do Silverlight).

Causa

Esse aviso é acionado em um método que vincula a um delegado é marcado com o SecurityCriticalAttribute para um método que é transparente ou que é marcado com o SecuritySafeCriticalAttribute. O aviso também é acionado um método que vincula a um delegado que é transparente ou crítico de seguro para um método critical.

Descrição da regra

Tipos delegate e os métodos que eles se ligam devem possuir uma transparência consistente. Delegados transparentes e críticos de seguros somente podem ligar para outros métodos transparentes ou críticos de seguros. Da mesma forma, delegados críticos podem ligar apenas métodos críticos. Essas regras de vinculação se somente o código que pode invocar um método por meio de um representante pode ter também chamada o mesmo método diretamente. Por exemplo, regras de ligação impedir código transparent chamando código crítico diretamente por meio de um delegado transparente.

Como corrigir violações

Para corrigir uma violação a este aviso, altere a transparência do representante ou do método que ele liga para que a transparência dos dois são equivalentes.

Quando suprimir avisos

Não suprimir um aviso da regra.

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