Partager via


CA2132 : Les constructeurs par défaut doivent être au moins aussi critiques que les constructeurs par défaut de type de base

TypeName

DefaultConstructorsMustHaveConsistentTransparency

CheckId

CA2132

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

L'attribut de transparence du constructeur par défaut d'une classe dérivée n'est pas aussi critique que la transparence de la classe de base.

Description de la règle

Les types et les membres qui possèdent SecurityCriticalAttribute ne peuvent pas être utilisés par le code d'application Silverlight. Les types et membres critiques de sécurité (security-critical) peuvent être uniquement utilisés par le code de confiance dans la bibliothèque de classes .NET Framework pour Silverlight. Dans la mesure où une construction publique ou protégée dans une classe dérivée doit avoir la même transparence ou une transparence supérieure à sa classe de base, une classe dans une application ne peut pas être dérivée d'une classe marquée SecurityCritical.

Pour le code de plateforme CoreCLR, si un type de base a ensuite un constructeur par défaut opaque protégé ou public le type dérivé doit obéir aux règles de l'héritage du constructeur par défaut. Le type dérivé doit également avoir un constructeur par défaut et ce constructeur doit être au moins aussi critique que le constructeur par défaut du type de base.

Comment corriger les violations

Pour résoudre la violation, supprimez le type ou n'effectuez pas de dérivation à partir du type non transparent de sécurité.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle. Les violations de cette règle par le code d'application provoquent le refus de CoreCLR de charger le type avec une TypeLoadException.

Code

using System;
using System.Security;

namespace TransparencyWarningsDemo
{

    public class BaseWithSafeCriticalDefaultCtor
    {
        [SecuritySafeCritical]
        public BaseWithSafeCriticalDefaultCtor() { }
    }

    public class DerivedWithNoDefaultCtor : BaseWithSafeCriticalDefaultCtor
    {
        // CA2132 violation - since the base has a public or protected non-transparent default .ctor, the
        // derived type must also have a default .ctor
    }

    public class DerivedWithTransparentDefaultCtor : BaseWithSafeCriticalDefaultCtor
    {
        // CA2132 violation - since the base has a safe critical default .ctor, the derived type must have
        // either a safe critical or critical default .ctor.  This is fixed by making this .ctor safe critical
        // (however, user code cannot be safe critical, so this fix is platform code only).
        DerivedWithTransparentDefaultCtor() { }
    }

    public class BaseWithCriticalCtor
    {
        [SecurityCritical]
        public BaseWithCriticalCtor() { }
    }

    public class DerivedWithSafeCriticalDefaultCtor : BaseWithSafeCriticalDefaultCtor
    {
        // CA2132 violation - since the base has a critical default .ctor, the derived must also have a critical
        // default .ctor.  This is fixed by making this .ctor critical, which is not available to user code
        [SecuritySafeCritical]
        public DerivedWithSafeCriticalDefaultCtor() { }
    }
}