Udostępnij za pośrednictwem


CA2134: Metody muszą przechowywać spójną jawność podczas nadpisywania metod bazowych

TypeName

MethodsMustOverrideWithConsistentTransparency

CheckId

CA2134

Kategoria

Microsoft.Security

Zmiana kluczowa

Kluczowa

Przyczyna

Ta reguła jest uruchamiana, gdy metoda oznaczona atrybutem SecurityCriticalAttribute zastępuje metodę, która jest przezroczysta lub oznaczona atrybutem SecuritySafeCriticalAttribute.Reguła ta jest również uruchamiana, gdy metoda przezroczysta lub oznaczona atrybutem SecuritySafeCriticalAttribute zastępuje metodę oznaczoną atrybutem SecurityCriticalAttribute.

Reguła jest stosowana podczas zastępowania metody wirtualnej lub implementującej interfejs.

Opis reguły

Ta reguła jest uruchamiana w przypadku próby zmiany zabezpieczeń dostępności metody dalszego łańcucha dziedziczenia.Na przykład jeśli metoda wirtualna w klasie podstawowej jest przezroczysta lub bezpieczna-krytyczna, wtedy klasa pochodna musi ją zastąpić metodą przezroczystą lub bezpieczną-krytyczną.Odwrotnie, jeśli metoda wirtualna jest krytyczna dla bezpieczeństwa, wtedy klasa pochodna musi go zastąpić metodą krytyczną dla bezpieczeństwa.Ta sama reguła dotyczy implementowania metod interfejsu.

Reguły przejrzystości są wymuszane, gdy kod jest kompilowany JIT zamiast w czasie wykonywania, ponieważ obliczenia przezroczystości nie mają informacji typu dynamicznego.Dlatego wynik obliczeń przejrzystości musi być możliwy do określenia wyłącznie z typów statycznych skompilowanych JIT, niezależnie od typu dynamicznego.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, należy zmienić przezroczystość metody, która zastępuje metodę wirtualną lub implementuje interfejs, aby dopasować przezroczystość do metody wirtualnej lub interfejsu.

Kiedy pominąć ostrzeżenia

Nie należy pomijać ostrzeżenia dotyczącego tej reguły.Naruszenia tej reguły spowodują w czasie wykonywania zgłoszenie wyjątku TypeLoadException dla zestawów używających 2. poziomu przezroczystości.

Przykłady

Kod

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

}

Zobacz też

Koncepcje

Kod o przezroczystym poziomie bezpieczeństwa, poziom 2