Partilhar via


CA2133: os representantes devem ser associados a métodos com transparência consistente

TypeName

DelegatesMustBindWithConsistentTransparency

CheckId

CA2133

Categoria

Microsoft.Security

Alteração Significativa

Quebra

ObservaçãoObservação

Esse aviso é aplicado somente ao código que está executando o CoreCLR (a versão do CLR que é específica para aplicativos Web do Silverlight).

Causa

Esse aviso é acionado em um método que associa um representante que é marcado com SecurityCriticalAttribute a um método que é transparente ou que é marcado com SecuritySafeCriticalAttribute.O aviso também será acionado um método que associa um delegado que é transparente seguro- crítico ou a um método crítico.

Descrição da Regra

Tipos de delegação e métodos que associam no deve ter transparência consistente.O delega transparentes e seguro- críticos podem ser associado a outros métodos transparentes ou seguro- críticos.Da mesma forma, os representantes críticos podem ser associado aos métodos importantes.Essas regras de associação garantem que o único código que pode invocar um método através de um representante também poderia ter o mesmo método chamado diretamente.Por exemplo, as regras de associação impedir que o código transparente chama o código crítico diretamente por meio de um representante transparente.

Como Corrigir Violações

Para corrigir uma violação desse aviso, alterar a transparência de delegação ou do método que associa de forma que a transparência dos dois for equivalente.

Quando Suprimir Alertas

Não elimine um alerta desta 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() { }
    }
}