Compartir a través de


CA2146: Los tipos deben ser al menos tan críticos para la seguridad como sus interfaces y tipos base

Nombre de tipo

TypesMustBeAtLeastAsCriticalAsBaseTypes

Identificador de comprobación

CA2146

Categoría

Microsoft.Security

Cambio problemático

Motivo

Un tipo transparente se deriva de un tipo que está marcado con SecuritySafeCriticalAttribute o SecurityCriticalAttribute, o de un tipo que está marcado con el atributo SecuritySafeCriticalAttribute se deriva de un tipo que está marcado con el atributo SecurityCriticalAttribute.

Descripción de la regla

Esta regla se desencadena cuando un tipo derivado tiene un atributo de transparencia de seguridad que no es tan crítico como su tipo base o interfaz implementada.Solo los tipos críticos pueden derivar de los tipos base críticos o implementar interfaces críticas, y solo los tipos críticos o críticos para la seguridad pueden derivar de tipos base críticos para la seguridad o implementar interfaces críticas para la seguridad.Las infracciones de esta regla en una transparencia de nivel 2 producirán una TypeLoadException para el tipo derivado.

Cómo corregir infracciones

Para corregir esta infracción, marque el tipo derivado o que implementa con un atributo de transparencia que sea por lo menos tan crítico como el tipo base o la interfaz.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Ejemplo

using System;
using System.Security;

namespace TransparencyWarningsDemo
{

    [SecuritySafeCritical]
    public class SafeCriticalBase
    {
    }

    // CA2156 violation - a transparent type cannot derive from a safe critical type.  The fix is any of:
    //   1. Make SafeCriticalBase transparent
    //   2. Make TransparentFromSafeCritical safe critical
    //   3. Make TransparentFromSafeCritical critical
    public class TransparentFromSafeCritical : SafeCriticalBase
    {
    }

    [SecurityCritical]
    public class CriticalBase
    {
    }

    // CA2156 violation - a transparent type cannot derive from a critical type.  The fix is any of:
    //   1. Make CriticalBase transparent
    //   2. Make TransparentFromCritical critical
    public class TransparentFromCritical : CriticalBase
    {
    }

    // CA2156 violation - a safe critical type cannot derive from a critical type.  The fix is any of:
    //   1. Make CriticalBase transparent
    //   2. Make CriticalBase safe critical
    //   3. Make SafeCriticalFromCritical critical
    [SecuritySafeCritical]
    public class SafeCriticalFromCritical : CriticalBase
    {
    }

}