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çã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 que é marcado com o SecurityCriticalAttribute para um método que é transparente ou que está marcado com o SecuritySafeCriticalAttribute.O aviso também é acionado para um método que vincula a um delegado que é transparente ou safe essenciais 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 seguros críticos só poderão se ligar a outros métodos transparentes ou safe críticos.Da mesma forma, delegados críticos só poderão se ligar a métodos críticos.Essas regras de vinculação se o único código que pode chamar um método por meio de um representante pode ter também chamada o mesmo método diretamente.Por exemplo, regras de ligação impedem código transparent chame 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() { }
}
}