Share via


CA2132: Standardkonstruktoren müssen mindestens so kritisch sein wie die Standardkonstruktoren des Basistyps.

Element Wert
RuleId CA2132
Category Microsoft.Security
Unterbrechende Änderung Breaking

Hinweis

Diese Warnung wird nur auf Code angewendet, der CoreCLR ausführt (die für Silverlight-Webanwendungen spezifische CLR-Version).

Ursache

Das Transparenzattribut des Standardkonstruktors einer abgeleiteten Klasse ist weniger kritisch als die Transparenz der Basisklasse.

Hinweis

Diese Regel wurde als veraltet markiert. Weitere Informationen finden Sie unter Veraltete Regeln.

Regelbeschreibung

Typen und Member mit SecurityCriticalAttribute können nicht vom Silverlight-Anwendungscode verwendet werden. Sicherheitsrelevante Typen und Member können nur von vertrauenswürdigem Code in der .NET Framework for Silverlight-Klassenbibliothek verwendet werden. Da eine öffentliche oder geschützte Konstruktion in einer abgeleiteten Klasse mindestens die gleiche Transparenz aufweisen muss wie die zugehörige Basisklasse, können Klassen in einer Anwendung nicht von Klassen abgeleitet werden, die als SecurityCritical markiert sind.

Weist ein Basistyp bei CoreCLR-Plattformcode einen öffentlichen oder geschützten, nicht transparenten Standardkonstruktor auf, muss der abgeleitete Typ die Vererbungsregeln des Standardkonstruktors einhalten. Der abgeleitete Typ muss ebenfalls über einen Standardkonstruktor verfügen, der mindestens genauso kritisch wie der Standardkonstruktor des Basistyps ist.

Behandeln von Verstößen

Entfernen Sie den Typ, oder leiten Sie nicht vom nicht sicherheitstransparenten Typ ab, um den Verstoß zu beheben.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnungen von dieser Regel. Verstöße gegen diese Regel durch Anwendungscode führen dazu, dass CoreCLR das Laden des Typs mit einer TypeLoadException-Ausnahme ablehnt.

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