CA2146: типы должны быть по крайней мере настолько же критичны, как их базовые типы и интерфейсы

Товар Значение
Идентификатор правила CA2146
Категория Microsoft.Security
Критическое изменение Критическое

Причина

Прозрачный тип является производным от типа, помеченного SecuritySafeCriticalAttributeSecurityCriticalAttributeили типом, помеченным SecuritySafeCriticalAttribute атрибутом, производным от типа, помеченного атрибутом SecurityCriticalAttribute .

Примечание.

Это правило устарело. Дополнительные сведения см. в разделе "Устаревшие правила".

Описание правила

Это правило срабатывает, если у производного типа есть атрибут прозрачности безопасности, не такой критический, как базовый тип или реализованный интерфейс. От критических базовых типов или реализованных критических интерфейсов могут производиться только критические типы, и от критических в плане безопасности базовых типов или реализованных интерфейсов могут производиться только критические в плане безопасности типы. Нарушения этого правила в прозрачности уровня 2 приводят к TypeLoadException получению производного типа.

Устранение нарушений

Чтобы устранить это нарушение, помечайте производный или реализующий тип атрибутом прозрачности, который по крайней мере является критически важным, как базовый тип или интерфейс.

Когда лучше отключить предупреждения

Для этого правила отключать вывод предупреждений не следует.

Пример

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

}