Freigeben über


CA2146: Typen müssen mindestens genauso kritisch sein wie ihre Basistypen und Schnittstellen

TypeName

TypesMustBeAtLeastAsCriticalAsBaseTypes

CheckId

CA2146

Kategorie

Microsoft.Security

Unterbrechende Änderung

Breaking

Ursache

Ein transparenter Typ wird von einem Typ abgeleitet, der mit dem SecuritySafeCriticalAttribute- oder dem SecurityCriticalAttribute-Element markiert ist, oder ein Typ, der mit dem SecuritySafeCriticalAttribute-Attribut markiert ist, wird von einem Typ abgeleitet, der mit dem SecurityCriticalAttribute-Attribut markiert ist.

Regelbeschreibung

Diese Regel wird ausgelöst, wenn ein abgeleiteter Typ über ein Sicherheitstransparenzattribut verfügt, das nicht so wichtig wie der Basistyp oder die implementierte Schnittstelle ist. Nur wichtige Typen können von wichtigen Basistypen abgeleitet werden oder kritische Schnittstellen implementieren, und nur kritische oder sicherheitskritische Typen können von sicherheitskritischen Basistypen abgeleitet werden oder sicherheitskritische Schnittstellen implementieren. Verstöße gegen diese Regel in Transparenz der Ebene 2 führen zu einer TypeLoadException für den abgeleiteten Typ.

Behandeln von Verstößen

Um diese Verletzung zu korrigieren, markieren Sie den abgeleiteten Typ oder Implementierungstyp mit einem Transparenzattribut, das mindestens so wichtig wie der Basistyp oder die Schnittstelle ist.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel.

Beispiel

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

}