Share via


CA2134: Los métodos deben mantener una transparencia coherente al invalidar métodos base

Elemento Valor
RuleId CA2134
Category Microsoft.Security
Cambio importante Problemático

Causa

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

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

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

Descripción de la regla

Esta regla se activa en los intentos por cambiar la accesibilidad de seguridad de un método más allá 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. Por el contrario, si 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 para implementar métodos de interfaz.

Las reglas de transparencia se aplican cuando el código se compila con JIT en lugar de en tiempo de ejecución, de modo que el cálculo de transparencia no tenga información de tipo dinámico. Por lo tanto, el resultado del cálculo de transparencia debe ser capaz de determinarse únicamente a partir de los tipos estáticos que se compilan con JIT, independientemente del tipo dinámico.

Cómo corregir infracciones

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

Cuándo suprimir las advertencias

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

Ejemplos

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

}

Consulte también

Código transparente en seguridad, nivel 2