CA2134: методы должны сохранять согласованную прозрачность при переопределении базовых методов
TypeName |
MethodsMustOverrideWithConsistentTransparency |
CheckId |
CA2134 |
Категория |
Microsoft.Security |
Критическое изменение |
Критическое изменение |
Причина
Это правило срабатывает, если метод, отмеченный атрибутом SecurityCriticalAttribute, переопределяет метод, который является прозрачным или отмечен атрибутом SecuritySafeCriticalAttribute.Это правило также срабатывает, если прозрачный метод или метод, отмеченный атрибутом SecuritySafeCriticalAttribute, переопределяет метод, отмеченный атрибутом SecurityCriticalAttribute.
Это правило применяется при переопределении виртуального метода или реализации интерфейса.
Описание правила
Это правило срабатывает при попытках изменить уровень доступности метода вверх по цепочке наследования.Например, если виртуальный метод в базовом классе является прозрачным или критичным в плане безопасности, то производный класс должен переопределять его с помощью прозрачного или критичного в плане безопасности метода.И наоборот, если виртуальный метод является критически важным для безопасности, производный класс должен переопределить его методом критически важным для безопасности.Это же правило применяется для реализации методов интерфейса.
Правила прозрачности применяются, если код получен в результате JIT-компиляции, а не во время выполнения, поэтому в расчете прозрачности нет сведений о динамических типах.Таким образом, должна быть возможность определить результат расчета прозрачности исключительно из статических типов, JIT-компиляция которых выполняется, независимо от динамического типа.
Устранение нарушений
Чтобы устранить нарушение данного правила, измените прозрачность метода, который переопределяет виртуальный метод или реализует интерфейс в соответствии с прозрачностью виртуального метода или метода интерфейса.
Отключение предупреждений
Не следует отключать вывод предупреждений для этого правила.Нарушения этого правила приведут к исключению TypeLoadException среды выполнения для сборок, использующих прозрачность уровня 2.
Примеры
Код
using System;
using System.Security;
namespace TransparencyWarningsDemo
{
public interface IInterface
{
void TransparentInterfaceMethod();
[SecurityCritical]
void CriticalInterfaceMethod();
}
public class Base
{
public virtual void TransparentVirtual() { }
[SecurityCritical]
public virtual void CriticalVirtual() { }
}
public class Derived : Base, IInterface
{
// CA2134 violation - implementing a transparent method with a critical one. This can be fixed by any of:
// 1. Making IInterface.TransparentInterfaceMethod security critical
// 2. Making Derived.TransparentInterfaceMethod transparent
// 3. Making Derived.TransparentInterfaceMethod safe critical
[SecurityCritical]
public void TransparentInterfaceMethod() { }
// CA2134 violation - implementing a critical method with a transparent one. This can be fixed by any of:
// 1. Making IInterface.CriticalInterfaceMethod transparent
// 2. Making IInterface.CriticalInterfaceMethod safe critical
// 3. Making Derived.TransparentInterfaceMethod critical
public void CriticalInterfaceMethod() { }
// CA2134 violation - overriding a transparent method with a critical one. This can be fixed by any of:
// 1. Making Base.TrasnparentVirtual critical
// 2. Making Derived.TransparentVirtual transparent
// 3. Making Derived.TransparentVirtual safe critical
[SecurityCritical]
public override void TransparentVirtual() { }
// CA2134 violation - overriding a critical method with a transparent one. This can be fixed by any of:
// 1. Making Base.CriticalVirtual transparent
// 2. Making Base.CriticalVirtual safe critical
// 3. Making Derived.CriticalVirtual critical
public override void CriticalVirtual() { }
}
}