Condividi tramite


CA2146: I tipi devono essere Critical almeno come le interfacce e i tipi base relativi

TypeName

TypesMustBeAtLeastAsCriticalAsBaseTypes

CheckId

CA2146

Category

Microsoft.Security

Breaking Change

Breaking

Causa

Il tipo Trasparent derivato da un tipo contrassegnato da SecuritySafeCriticalAttribute o da SecurityCriticalAttribute oppure un tipo che è contrassegnato dall'attributo SecuritySafeCriticalAttribute è derivato da un tipo contrassegnato con l'attributo SecurityCriticalAttribute.

Descrizione della regola

Questa regola viene attivata quando un tipo derivato dispone di un attributo di trasparenza di sicurezza che non è critico come il tipo di base o l'interfaccia implementata. Solo i tipi critici possono derivare da tipi di base critici o implementare interfacce critiche e solo tipi critici o critici per la sicurezza possono derivare da tipi di base critici per la sicurezza o implementare interfacce critiche per la sicurezza. Violazioni di questa regola della trasparenza di livello 2 risultino in un TypeLoadException per il tipo derivato.

Come correggere le violazioni

Per correggere questa violazione, contrassegnare il tipo derivato o di implementazione con un attributo di trasparenza che è almeno critico quanto il tipo di base o l'interfaccia.

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

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
    {
    }

}