CA2133: делегаты должны привязываться к методам с согласованной прозрачностью
TypeName |
DelegatesMustBindWithConsistentTransparency |
CheckId |
CA2133 |
Категория |
Microsoft.Security |
Критическое изменение |
Критическое изменение |
Примечание |
---|
Это предупреждение применяется только для кода, выполняющего CoreCLR (версию CLR для веб-приложений Silverlight). |
Причина
Это предупреждение выдается, если метод, привязывающий делегата, отмеченного атрибутом SecurityCriticalAttribute, с прозрачным методом или методом, отмеченным атрибутом SecuritySafeCriticalAttribute.Предупреждение также запускает метод, который привязывает прозрачный или безопасный делегат к критическому методу.
Описание правила
Типы делегатов и методы, к которым они привязаны, должны иметь соответствующую прозрачность.Прозрачные и критические для безопасности делегаты могут быть привязаны только к другим прозрачным или критическим для безопасности методам.Точно так же критические делегаты могут быть привязаны только к критическим методам.Эти правила привязки позволяют гарантировать, что только код, который может вызвать метод через делегат, также может вызвать тот же метод непосредственно.Например, правила привязки предотвращают вызов прозрачным кодом критичного кода непосредственно через прозрачный делегат.
Устранение нарушений
Чтобы устранить нарушение этого предупреждения, измените прозрачность делегата или метода, привязка которого выполняется, чтобы их прозрачность была эквивалентна.
Отключение предупреждений
Для этого правила отключать вывод предупреждений не следует.
Код
using System;
using System.Security;
namespace TransparencyWarningsDemo
{
public delegate void TransparentDelegate();
[SecurityCritical]
public delegate void CriticalDelegate();
public class TransparentType
{
void DelegateBinder()
{
// CA2133 violation - binding a transparent delegate to a critical method
TransparentDelegate td = new TransparentDelegate(CriticalTarget);
// CA2133 violation - binding a critical delegate to a transparent method
CriticalDelegate cd = new CriticalDelegate(TransparentTarget);
}
[SecurityCritical]
void CriticalTarget() { }
void TransparentTarget() { }
}
}