CA2146 : Les types doivent être au moins aussi critiques que les types de base et les interfaces

Élément Valeur
ID de la règle CA2146
Category Microsoft.Security
Modification avec rupture Rupture

Cause

Un type transparent est dérivé d’un type marqué avec SecuritySafeCriticalAttribute ou SecurityCriticalAttribute, ou un type marqué avec l’attribut SecuritySafeCriticalAttribute est dérivé d’un type marqué avec l’attribut SecurityCriticalAttribute.

Notes

Cette règle est déconseillée. Pour plus d’informations, consultez Règles dépréciées.

Description de la règle

Cette règle se déclenche lorsqu’un type dérivé a un attribut de transparence de sécurité qui n’est pas aussi critique que son type de base ou l’interface implémentée. Seuls les types critiques peuvent dériver des types de base critiques ou implémenter des interfaces critiques, et seuls les types critiques ou critiques sécurisés peuvent dériver des types de base critiques sécurisés ou implémenter des interfaces critiques sécurisées. Les violations de cette règle dans la transparence de niveau 2 entraînent un TypeLoadException pour le type dérivé.

Comment corriger les violations

Pour corriger cette violation, marquez le type dérivé ou d’implémentation avec un attribut de transparence au moins aussi critique que le type de base ou l’interface.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

using System;
using System.Security;

namespace TransparencyWarningsDemo
{

    [SecuritySafeCritical]
    public class SafeCriticalBase
    {
    }

    // CA2156 violation - a transparent type cannot derive from a safe critical type.  The fix is any of:
    //   1. Make SafeCriticalBase transparent
    //   2. Make TransparentFromSafeCritical safe critical
    //   3. Make TransparentFromSafeCritical critical
    public class TransparentFromSafeCritical : SafeCriticalBase
    {
    }

    [SecurityCritical]
    public class CriticalBase
    {
    }

    // CA2156 violation - a transparent type cannot derive from a critical type.  The fix is any of:
    //   1. Make CriticalBase transparent
    //   2. Make TransparentFromCritical critical
    public class TransparentFromCritical : CriticalBase
    {
    }

    // CA2156 violation - a safe critical type cannot derive from a critical type.  The fix is any of:
    //   1. Make CriticalBase transparent
    //   2. Make CriticalBase safe critical
    //   3. Make SafeCriticalFromCritical critical
    [SecuritySafeCritical]
    public class SafeCriticalFromCritical : CriticalBase
    {
    }

}