Share via


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

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

Causa

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

Nota

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

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 la transparencia de nivel 2 dan como resultado un elemento TypeLoadException para el tipo derivado.

Cómo corregir infracciones

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

Cuándo suprimir las 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
    {
    }

}