CA2134: 메서드는 기본 메서드를 재정의할 때 일관성 있는 방식을 유지해야 합니다.
TypeName |
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() { }
}
}