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