Поделиться через


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

TypeName

TypesMustBeAtLeastAsCriticalAsBaseTypes

CheckId

CA2146

Категория

Microsoft.Security

Критическое изменение

Критическое изменение

Причина

Прозрачный тип производится от типа, помеченного атрибутом SecuritySafeCriticalAttribute или SecurityCriticalAttribute, или тип, помеченный атрибутом 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
    {
    }

}