Freigeben über


CA2134: Methoden müssen beim Überschreiben von Basismethoden eine konsistente Transparenz wahren

TypeName

MethodsMustOverrideWithConsistentTransparency

CheckId

CA2134

Kategorie

Microsoft.Security

Unterbrechende Änderung

Breaking

Ursache

Diese Regel wird ausgelöst, wenn eine Methode, die mit dem SecurityCriticalAttribute-Objekt markiert ist, eine Methode überschreibt, die transparent oder mit dem SecuritySafeCriticalAttribute-Objekt markiert ist. Die Regel wird auch ausgelöst, wenn eine Methode, die transparent ist oder mit dem SecuritySafeCriticalAttribute-Objekt markiert ist, eine Methode überschreibt, die transparent oder mit dem SecurityCriticalAttribute-Objekt markiert ist.

Die Regel wird angewendet, wenn eine virtuelle Methode überschrieben oder eine Schnittstelle implementiert wird.

Regelbeschreibung

Diese Regel wird für Versuche ausgelöst, die Sicherheitsbarrierefreiheit einer Methode weiter oben in der Vererbungskette zu ändern. Wenn eine virtuelle Methode in einer Basisklasse z. B. transparent oder sicherheitsgeschützt ist, dann muss die abgeleitete Klasse sie mit einer transparenten oder sicherheitsgeschützten Methode überschreiben. Umgekehrt, wenn das virtuelle Element sicherheitskritisch ist, muss die abgeleitete Klasse es mit einer sicherheitskritischen Methode überschreiben. Die gleiche Regel gilt für das Implementieren von Schnittstellenmethoden.

Transparenzregeln werden erzwungen, wenn der Code JIT und nicht zur Laufzeit kompiliert wird, sodass die Transparenzberechnung keine dynamischen Typinformationen aufweist. Daher muss das Ergebnis der Transparenzberechnung ausschließlich anhand der statischen Typen bestimmt werden können, die JIT-kompiliert werden, und zwar unabhängig vom dynamischen Typ.

Behandeln von Verstößen

Um eine Verletzung dieser Regel zu korrigieren, ändern Sie die Transparenz der Methode, die eine virtuelle Methode überschreibt oder eine Schnittstelle implementiert, damit sie mit der Transparenz der virtuellen Methode oder der Schnittstellenmethode übereinstimmt.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel. Verstöße gegen diese Regel führen zu einer Laufzeit TypeLoadException für Assemblys, die Transparenz der Ebene 2 verwenden.

Beispiele

Code

using System;
using System.Security;

namespace TransparencyWarningsDemo
{

    public interface IInterface
    {
        void TransparentInterfaceMethod();

        [SecurityCritical]
        void CriticalInterfaceMethod();
    }

    public class Base
    {
        public virtual void TransparentVirtual() { }

        [SecurityCritical]
        public virtual void CriticalVirtual() { }
    }

    public class Derived : Base, IInterface
    {
        // CA2134 violation - implementing a transparent method with a critical one.  This can be fixed by any of:
        //   1. Making IInterface.TransparentInterfaceMethod security critical
        //   2. Making Derived.TransparentInterfaceMethod transparent
        //   3. Making Derived.TransparentInterfaceMethod safe critical
        [SecurityCritical]
        public void TransparentInterfaceMethod() { }

        // CA2134 violation - implementing a critical method with a transparent one.  This can be fixed by any of:
        //   1. Making IInterface.CriticalInterfaceMethod transparent
        //   2. Making IInterface.CriticalInterfaceMethod safe critical
        //   3. Making Derived.TransparentInterfaceMethod critical
        public void CriticalInterfaceMethod() { }

        // CA2134 violation - overriding a transparent method with a critical one.  This can be fixed by any of:
        //   1. Making Base.TrasnparentVirtual critical
        //   2. Making Derived.TransparentVirtual transparent
        //   3. Making Derived.TransparentVirtual safe critical
        [SecurityCritical]
        public override void TransparentVirtual() { }

        // CA2134 violation - overriding a critical method with a transparent one.  This can be fixed by any of:
        //   1. Making Base.CriticalVirtual transparent
        //   2. Making Base.CriticalVirtual safe critical
        //   3. Making Derived.CriticalVirtual critical
        public override void CriticalVirtual() { }
    }

}

Siehe auch

Konzepte

Sicherheitstransparenter Code, Ebene 2