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