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


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

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

Примечание.

Это предупреждение применяется только к коду, на котором выполняется CoreCLR (версия среды CLR, относящейся к веб-приложениям Silverlight).

Причина

Атрибут прозрачности конструктора по умолчанию производного класса не является столь важным, как прозрачность базового класса.

Примечание.

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

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

Типы и члены, которые не SecurityCriticalAttribute могут использоваться кодом приложения Silverlight. Критичные в плане безопасности типы и элементы могут использоваться только надежным кодом в среде .NET Framework для библиотеки классов Silverlight. Поскольку открытая или защищенная конструкция в производном классе должна иметь ту же или большую прозрачность, чем ее базовый класс, класс в приложении не может быть производным от класса, помеченного как SecurityCritical.

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

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

Чтобы устранить нарушение, удалите тип или не наследуйте от непрозрачного типа безопасности.

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

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

Код

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