Compartilhar via


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

Item Valor
RuleId CA2133
Categoria Microsoft.Security
Alteração da falha Quebra

Observação

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

Causa

Esse aviso é acionado em um método que associa um delegado que foi marcado com SecurityCriticalAttribute a um método transparente ou marcado com SecuritySafeCriticalAttribute. O aviso também é acionado em um método que associa um representante transparente ou de segurança crítica a um método crítico.

Observação

Esta regra foi preterida. Para obter mais informações, confira Regras preteridas.

Descrição da regra

Os tipos delegados e os métodos aos quais eles se associam devem ter transparência consistente. Delegados transparentes e críticos para a segurança podem se associar apenas a outros métodos transparentes ou críticos para a segurança. Da mesma forma, os delegados críticos só podem se associar a métodos críticos. Essas regras de associação garantem que o único código que possa invocar um método por meio de um delegado também possa ter invocado o mesmo método diretamente. Por exemplo, as regras de associação impedem que o código transparente invoque o código crítico diretamente por meio de um delegado transparente.

Como corrigir violações

Para corrigir a violação desse aviso, altere a transparência do delegado ou do método ao qual ele se associa para que a transparência dos dois seja equivalente.

Quando suprimir avisos

Não suprima um aviso nessa 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() { }
    }
}