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