CA2133 : Les délégués doivent lier les méthodes avec une transparence cohérente
TypeName |
DelegatesMustBindWithConsistentTransparency |
CheckId |
CA2133 |
Catégorie |
Microsoft.Security |
Modification avec rupture |
Oui |
[!REMARQUE]
Cet avertissement est appliqué uniquement au code exécutant CoreCLR (version du CLR qui est spécifique aux applications Web Silverlight).
Cause
Cet avertissement déclenche sur une méthode qui lie un délégué marqué avec l'SecurityCriticalAttribute à une méthode qui est transparente ou marquée avec l'SecuritySafeCriticalAttribute.L'avertissement déclenche également une méthode qui lie un délégué transparent ou critique sécurisé à une méthode critique.
Description de la règle
Les types délégués et les méthodes qu'ils lient doivent avoir une transparence cohérente.Les délégués transparents et sécurisés (safe-critical) peuvent être liés uniquement à d'autres méthodes transparentes et sécurisées (safe-critical).De même, les délégués critiques peuvent être liés uniquement à des méthodes critiques.Ces règles de liaison vérifient que le seul code qui peut appeler une méthode via un délégué aurait également pu appeler directement la même méthode.Par exemple, la liaison de règles empêche le code transparent d'appeler directement le code critique via un délégué transparent.
Comment corriger les violations
Pour résoudre une violation de cet avertissement, modifiez la transparence du délégué ou de la méthode qu'il lie afin que la transparence des deux soit équivalente.
Quand supprimer les avertissements
Ne supprimez aucun avertissement de cette règle.
Code
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() { }
}
}