CA2134: методы должны сохранять согласованную прозрачность при переопределении базовых методов

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

Причина

Это правило запускается, когда метод, SecurityCriticalAttribute помеченный переопределением метода, который является прозрачным или помеченным с помощью .SecuritySafeCriticalAttribute Правило также запускается, когда метод, который является прозрачным или помеченным переопределяет SecuritySafeCriticalAttribute метод, помеченный с помощью метода SecurityCriticalAttribute.

Это правило применяется при переопределении виртуального метода или реализации интерфейса.

Примечание.

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

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

Это правило запускает попытки изменить специальные возможности безопасности метода далее по цепочке наследования. Например, если виртуальный метод в базовом классе является прозрачным или безопасным, производный класс должен переопределить его прозрачным или безопасным критическим методом. И наоборот, если виртуальная виртуальная машина является критической для безопасности, производный класс должен переопределить его с помощью критического метода безопасности. Это же правило применяется для реализации методов интерфейса.

Правила прозрачности применяются при компиляции кода, а не во время выполнения, чтобы вычисления прозрачности не имели сведений о динамическом типе. Таким образом, результат вычисления прозрачности должен быть способен определяться исключительно из статических типов, скомпилированных 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() { }
    }

}

См. также

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