Partager via


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

Notes

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

Types délégués et les méthodes avec lesquelles ils créent une liaison doivent avoir la transparence cohérente. Les délégués transparents et critiques sécurisés ne peuvent être liés qu'à d'autres méthodes transparentes ou critiques sécurisées. De la même façon, les délégués critiques peuvent uniquement être liés aux 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() { }
    }
}