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


CA2131: типы критической безопасности могут не участвовать в эквивалентности типа

TypeName

CriticalTypesMustNotParticipateInTypeEquivalence

CheckId

CA2131

Категория

Microsoft.Security

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

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

Причина

Тип участвует в эквивалентности типов и либо сам тип, либо его элемент или поле помечается атрибутом SecurityCriticalAttribute.

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

Это правило применяется ко всем критическим типам или к типам, содержащим критические методы или поля, участвующие в эквивалентности типов. Когда среда CLR обнаруживает такой тип, происходит сбой загрузки с TypeLoadException во время выполнения. Обычно это правило срабатывает, только если пользователи реализуют эквивалентность типов вручную вместо того, чтобы позволить tlbimp и компиляторам обработать эквивалентность типов.

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

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

Отключение предупреждений

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

Пример

В следующих примерах демонстрируются интерфейс, метод и поле, вызывающие срабатывание этого правила.

using System;
using System.Security;
using System.Runtime.InteropServices;

[assembly: SecurityRules(SecurityRuleSet.Level2)]
[assembly: AllowPartiallyTrustedCallers]

namespace TransparencyWarningsDemo
{

    // CA2131 error - critical type participating in equivilance
    [SecurityCritical]
    [TypeIdentifier("3a5b6203-2bf1-4f83-b5b4-1bdc334ad3ea", "ICriticalEquivilentInterface")]
    public interface ICriticalEquivilentInterface
    {
        void Method1();
    }

    [TypeIdentifier("3a5b6203-2bf1-4f83-b5b4-1bdc334ad3ea", "ITransparentEquivilentInterface")]
    public interface ITransparentEquivilentInterface
    {
        // CA2131 error - critical method in a type participating in equivilance
        [SecurityCritical]
        void CriticalMethod();
    }

    [SecurityCritical]
    [TypeIdentifier("3a5b6203-2bf1-4f83-b5b4-1bdc334ad3ea", "ICriticalEquivilentInterface")]
    public struct EquivilentStruct
    {
        // CA2131 error - critical field in a type participating in equivalence
        [SecurityCritical]
        public int CriticalField;
    }
}

См. также

Основные понятия

Прозрачный с точки зрения безопасности код, уровень 2