Compartir a través de


CA2134: Los métodos deben mantener una transparencia coherente cuando reemplazan métodos base

Nombre de tipo

MethodsMustOverrideWithConsistentTransparency

Identificador de comprobación

CA2134

Categoría

Microsoft.Security

Cambio problemático

Motivo

Esta regla también se desencadena cuando un método marcado con SecurityCriticalAttribute invalida un método que es transparente o está marcado con SecuritySafeCriticalAttribute.La regla también se desencadena cuando un método que es transparente o está marcado con SecuritySafeCriticalAttribute invalida un método que está marcado con SecurityCriticalAttribute.

Se aplica la regla al invalidar un método virtual o implementar una interfaz.

Descripción de la regla

Esta regla se desencadena en los intentos de cambiar la accesibilidad de seguridad de un método más arriba de la cadena de herencia.Por ejemplo, si un método virtual de una clase base es transparente o crítico para la seguridad, la clase derivada debe invalidarlo con un método transparente o crítico para la seguridad.A la inversa, si es el método virtual es crítico para la seguridad, la clase derivada debe invalidarlo con un método crítico para la seguridad.La misma regla se aplica al implementar métodos de interfaz.

Las reglas de transparencia se exigen cuando el código es compilado JIT en lugar de en tiempo de ejecución, para que el cálculo de la transparencia no tenga información del tipo dinámico.Por consiguiente, el resultado del cálculo de la transparencia se debe poder definir solamente a partir de los tipos estáticos a los que se aplica la compilación JIT, sin tener en cuenta el tipo dinámico.

Cómo corregir infracciones

Para corregir una infracción de esta regla, cambie la transparencia del método que está invalidando un método virtual o está implementando una interfaz para que coincida con la transparencia del método virtual o del método de interfaz.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.Las infracciones de esta regla producirán una TypeLoadException en tiempo de ejecución para los ensamblados que utilizan la transparencia de nivel 2.

Ejemplos

Dd997447.collapse_all(es-es,VS.110).gifCódigo

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

}

Vea también

Conceptos

Código transparente en seguridad, nivel 2