다음을 통해 공유


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

}

참고 항목

개념

보안 투명 코드, 수준 2