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() { }
}
}