Condividi tramite


CA2134: I metodi devono conservare trasparenza consistente durante l'override dei metodi base

Articolo Valore
ID regola CA2134
Category Microsoft.Security
Modifica Interruzione

Causa

Questa regola viene attivata quando un metodo contrassegnato con esegue l'override SecurityCriticalAttribute di un metodo trasparente o contrassegnato con .SecuritySafeCriticalAttribute La regola viene inoltre attivata quando un metodo trasparente o contrassegnato con l'override SecuritySafeCriticalAttribute di un metodo contrassegnato con un oggetto SecurityCriticalAttribute.

La regola è applicata in caso di esecuzione dell'override di un metodo virtuale o di implementazione di un'interfaccia.

Nota

Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.

Descrizione regola

Questa regola viene attivata nei tentativi di modificare l'accessibilità di sicurezza di un metodo verso l'alto verso l'alto della catena di ereditarietà. Ad esempio, se un metodo virtuale in una classe base è trasparente o critico, la classe derivata deve eseguirne l'override con un metodo trasparente o critico sicuro. Viceversa, se la macchina virtuale è critica per la sicurezza, la classe derivata deve eseguirne l'override con un metodo critico per la sicurezza. La stessa regola si applica per l'implementazione di metodi di interfaccia.

Le regole di trasparenza vengono applicate quando il codice viene compilato JIT anziché in fase di esecuzione, in modo che il calcolo della trasparenza non disponga di informazioni sul tipo dinamico. Pertanto, il risultato del calcolo della trasparenza deve essere determinato esclusivamente dai tipi statici compilati tramite JIT, indipendentemente dal tipo dinamico.

Come correggere le violazioni

Per correggere una violazione di questa regola, modificare la trasparenza del metodo che esegue l'override di un metodo virtuale o l'implementazione di un'interfaccia in modo che corrisponda alla trasparenza del metodo virtuale o di interfaccia.

Quando eliminare gli avvisi

Non eliminare gli avvisi da questa regola. Le violazioni di questa regola comportano un run-time TypeLoadException per gli assembly che usano la trasparenza di livello 2.

Esempi

Codice

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

}

Vedi anche

Codice trasparente per la sicurezza, livello 2