Compartir a través de


CA2132: Los constructores predeterminados deben ser al menos tan críticos para la seguridad como los constructores predeterminados de tipo base

TypeName

DefaultConstructorsMustHaveConsistentTransparency

Identificador de comprobación

CA2132

Categoría

Microsoft.Security

Cambio problemático

Problemático

[!NOTA]

Esta advertencia solo se aplica al código que está ejecutando CoreCLR (la versión de CLR que es específica de las aplicaciones web de Silverlight).

Motivo

El atributo de transparencia del constructor predeterminado de una clase derivada no es tan crítico como la transparencia de la clase base.

Descripción de la regla

El código de aplicación de Silverlight no puede utilizar tipos y miembros que tengan SecurityCriticalAttribute.El código de confianza puede utilizar solo tipos y miembros críticos para la seguridad en .NET Framework para la biblioteca de clases de Silverlight.Dado que una construcción pública o protegida en una clase derivada debe tener la misma transparencia, o mayor, que su clase base, una clase de una aplicación no puede derivar de una clase marcada como SecurityCritical.

Para el código de plataforma de CoreCLR, si un tipo base tiene un constructor predeterminado no transparente público o protegido, el tipo derivado debe obedecer las reglas de herencia del constructor predeterminado.El tipo derivado también debe tener un constructor predeterminado y ese constructor debe ser al menos tan crítico como el constructor predeterminado del tipo base.

Cómo corregir infracciones

Para corregir la infracción, quite el tipo o no realice derivaciones de un tipo con seguridad no transparente.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.Las infracciones de esta regla por código de aplicación harán que CoreCLR rechace cargar el tipo con una TypeLoadException.

Código

using System;
using System.Security;

namespace TransparencyWarningsDemo
{

    public class BaseWithSafeCriticalDefaultCtor
    {
        [SecuritySafeCritical]
        public BaseWithSafeCriticalDefaultCtor() { }
    }

    public class DerivedWithNoDefaultCtor : BaseWithSafeCriticalDefaultCtor
    {
        // CA2132 violation - since the base has a public or protected non-transparent default .ctor, the 
        // derived type must also have a default .ctor
    }

    public class DerivedWithTransparentDefaultCtor : BaseWithSafeCriticalDefaultCtor
    {
        // CA2132 violation - since the base has a safe critical default .ctor, the derived type must have 
        // either a safe critical or critical default .ctor.  This is fixed by making this .ctor safe critical 
        // (however, user code cannot be safe critical, so this fix is platform code only).
        DerivedWithTransparentDefaultCtor() { }
    }

    public class BaseWithCriticalCtor
    {
        [SecurityCritical]
        public BaseWithCriticalCtor() { }
    }

    public class DerivedWithSafeCriticalDefaultCtor : BaseWithSafeCriticalDefaultCtor
    {
        // CA2132 violation - since the base has a critical default .ctor, the derived must also have a critical 
        // default .ctor.  This is fixed by making this .ctor critical, which is not available to user code
        [SecuritySafeCritical]
        public DerivedWithSafeCriticalDefaultCtor() { }
    }
}