다음을 통해 공유


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