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