CA2134:在重写基方法时,方法必须保持一致的透明度

类型名

MethodsMustOverrideWithConsistentTransparency

CheckId

CA2134

类别

Microsoft.Security

是否重大更改

原因

当方法是透明的或标记有 SecurityCriticalAttribute 并覆盖透明方法或标记有 SecuritySafeCriticalAttribute 的方法时,该规则也会被触发。 当方法是透明的或标记有 SecuritySafeCriticalAttribute 并覆盖标记有 SecurityCriticalAttribute 的方法时,该规则也会被触发。

该规则在重写虚方法或实现接口时应用。

规则说明

尝试更改方法的安全性辅助功能(进一步在继承链中)会激发此规则。 例如,如果基类中的虚拟方法为透明的或安全关键,那么派生类必须用透明或关键安全方法重写它。 相反,如果虚拟为安全关键,则派生的类必须用安全关键方法覆盖。 相同的规则应用于实现接口方法。

代码是 JIT 编译而不是在运行时编译,以便透明度计算不具有动态类型信息时,会强制执行透明度规则。 因此,透明度计算结果必须能够仅从正在 JIT 编译的静态类型确定,无论动态类型如何。

如何解决冲突

若要修复与该规则的冲突,更改方法的透明度,其被重写虚拟方法或实现接口以匹配虚拟或接口方法的透明度。

何时禁止显示警告

不要禁止显示与此规则有关的警告。 违反此规则将导致使用级别 2 透明度的程序集的运行时 TypeLoadException

示例

代码

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