CER(제한된 실행 지역)은 신뢰할 수 있는 관리 코드를 작성하기 위한 메커니즘의 일부입니다. CER은 CLR(공용 언어 런타임)이 영역의 코드가 완전히 실행되지 않도록 하는 대역 외 예외를 throw하지 못하도록 제한하는 영역을 정의합니다. 해당 지역 내에서 사용자 코드는 대역 외 예외를 발생시키는 코드를 실행하지 못하도록 제한됩니다. 메서드는 PrepareConstrainedRegions 블록 바로 앞에 try
표시하고 catch
finally
fault
블록을 제한된 실행 영역으로 지정해야 합니다. 제한된 지역으로 표시되면 코드는 강력한 안정성 계약을 가진 다른 코드만 호출해야 하며, 코드가 오류를 처리할 준비가 되지 않은 경우 준비되지 않았거나 신뢰할 수 없는 메서드에 가상 호출을 하지 않아야 합니다. CLR은 CER에서 실행되는 코드에 대한 스레드 중단을 지연합니다.
중요합니다
CER은 .NET Framework에서만 지원됩니다. 이 문서는 .NET Core 또는 .NET 5 이상에는 적용되지 않습니다.
제한된 실행 영역은 주석이 추가된 try
블록 외에도 CLR에서 여러 형태로 사용됩니다. 특히, CriticalFinalizerObject 클래스를 상속받은 클래스에서 중요한 종료자가 실행되며, ExecuteCodeWithGuaranteedCleanup 메서드를 사용하여 실행되는 코드에서도 활용됩니다.
CER 사전 준비
CLR은 메모리 부족 조건을 방지하기 위해 CER을 미리 준비합니다. 사전 준비는 CLR이 Just-In-Time 컴파일 또는 형식 로드 중에 메모리 부족 상태를 유발하지 않도록 해야 합니다.
개발자는 코드 영역이 CER임을 나타내야 합니다.
특성이 적용된 전체 호출 그래프 ReliabilityContractAttribute 의 최상위 CER 지역 및 메서드가 미리 준비됩니다. ReliabilityContractAttribute은/는 Success 또는 MayFail에 대한 상태만 보장할 수 있습니다.
가상 디스패치와 같이 정적으로 확인할 수 없는 호출에 대해서는 사전 준비를 수행할 수 없습니다. PrepareMethod 이러한 경우 메서드를 사용합니다. ExecuteCodeWithGuaranteedCleanup 메서드를 사용할 때, 정리 코드에 PrePrepareMethodAttribute 특성을 적용해야 합니다.
제약 조건
사용자는 CER에서 작성할 수 있는 코드 형식으로 제한됩니다. 코드는 다음과 같은 작업으로 인해 대역 외 예외를 발생시킬 수 없습니다.
명시적 할당입니다.
권투.
잠금을 획득합니다.
준비되지 않은 메서드를 가상으로 호출합니다.
신뢰성 계약이 약하거나 존재하지 않는 상태로 메서드를 호출합니다.
.NET Framework 버전 2.0에서 이러한 제약 조건은 지침입니다. 진단은 코드 분석 도구를 통해 제공됩니다.
안정성 계약
지정된 ReliabilityContractAttribute 메서드의 안정성 보장 및 손상 상태를 문서화하는 사용자 지정 특성입니다.
안정성 보장
열거형 값으로 Cer 표현되는 안정성 보장은 지정된 메서드의 안정성 수준을 나타냅니다.
MayFail; 예외적인 조건에서 메서드가 실패할 수 있습니다. 이 경우 메서드는 성공 또는 실패 여부를 호출하는 메서드에 다시 보고합니다. 반환 값을 보고할 수 있도록 메서드를 CER에 포함해야 합니다.
None; 메서드, 형식 또는 어셈블리에는 CER 개념이 없으며 상태 손상으로 인한 상당한 완화 없이 CER 내에서 호출하는 것이 안전하지 않을 수 있습니다. CER 보증을 활용하지 않습니다. 이것은 다음을 의미합니다.
예외 조건에서 메서드가 실패할 수 있습니다.
메서드가 실패했다고 보고하거나 보고하지 않을 수 있습니다.
이 메서드는 가장 가능성이 큰 시나리오인 CER을 사용하도록 작성되지 않았습니다.
메서드, 유형 또는 어셈블리가 성공하도록 명시적으로 식별되지 않는 경우, 암시적으로 식별된 것으로 간주합니다 None.
Success; 예외적 조건에서 메서드가 성공하도록 보장됩니다. 이 수준의 안정성을 달성하려면 비 CER 지역 내에서 호출되는 경우에도 항상 호출되는 메서드를 중심으로 CER을 생성해야 합니다. 성공을 주관적으로 볼 수 있지만 의도한 것을 수행하는 경우 메서드가 성공합니다. 예를 들어 Count를
ReliabilityContractAttribute(Cer.Success)
사용하여 표시하면 CER에서 실행될 때 항상 해당 요소 ArrayList 의 개수를 반환하며 내부 필드를 결정되지 않은 상태로 둘 수 없습니다. 그러나 CompareExchange 메서드도 성공으로 표시되며, 이는 경합 상태로 인해 값을 새 값으로 바꿀 수 없는 경우도 성공으로 간주될 수 있다는 것을 이해합니다. 핵심은 메서드가 문서화된 방식으로 동작하며, 정확하지만 신뢰할 수 없는 코드가 표시되는 것 이상으로 비정상적인 동작을 예상하기 위해 CER 코드를 작성할 필요가 없다는 것입니다.
부패 수준
열거형 값으로 Consistency 표시되는 손상 수준은 지정된 환경에서 손상될 수 있는 상태를 나타냅니다.
MayCorruptAppDomain; 예외적인 조건에서 CLR(공용 언어 런타임)은 현재 애플리케이션 도메인의 상태 일관성을 보장하지 않습니다.
MayCorruptInstance; 예외적인 조건에서 메서드는 상태 손상을 현재 인스턴스로 제한하도록 보장됩니다.
MayCorruptProcess- 예외적 조건에서 CLR은 상태 일관성을 보장하지 않습니다. 즉, 조건이 프로세스를 손상할 수 있습니다.
WillNotCorruptState; 예외적 조건에서는 메서드가 손상되지 않도록 보장됩니다.
안정성 시도/catch/종료
안정성 try/catch/finally
은 관리되지 않는 버전과 동일한 수준의 예측 가능성을 보장하는 예외 처리 메커니즘입니다.
catch/finally
블록은 CER입니다. 블록의 메서드는 사전 준비가 필요하며 무정전이어야 합니다.
.NET Framework 버전 2.0에서 코드는 try 블록 바로 앞에 호출 PrepareConstrainedRegions 하여 시도가 신뢰할 수 있음을 런타임에 알릴 수 있습니다. PrepareConstrainedRegions 는 컴파일러 지원 클래스의 RuntimeHelpers멤버입니다. 컴파일러를 통해 사용 가능 여부가 결정되는 대로 PrepareConstrainedRegions을 직접 호출합니다.
무정전 지역
무정전 지역은 명령 집합을 CER로 그룹화합니다.
.NET Framework 버전 2.0에서는 컴파일러 지원이 예정된 경우, 사용자 코드는 메서드 호출 앞에 PrepareConstrainedRegions 빈 try/catch 블록을 포함하는 신뢰할 수 있는 try/catch/finally를 사용하여 중단 불가능한 지역을 만듭니다.
중요 종료자 개체
가비지 컬렉션이 종료자를 실행하도록 보장합니다. 할당될 때, 종료자와 그 호출 그래프가 미리 준비됩니다. 종료자 메서드는 CER에서 실행되며 CER 및 종료자에 대한 모든 제약 조건을 준수해야 합니다.
모든 SafeHandle 및 CriticalHandle에서 상속받은 형식은 CER 내에서 종료자가 실행되도록 보장됩니다. 파생 클래스에서 ReleaseHandle을(를) 구현하여 SafeHandle 핸들을 해제하는 데 필요한 코드를 실행합니다.
CER에서 허용되지 않는 코드
CER에서는 다음 작업이 허용되지 않습니다.
명시적 할당.
잠금을 획득합니다.
권투.
다차원 배열 액세스.
리플렉션을 통해 메서드를 호출합니다.
보안 검사. 요청을 수행하지 않고 링크 요청만 수행합니다.
투명 프록시에서 필드를 가져오거나 설정합니다.
직렬화.
함수 포인터 및 대리자
참고하십시오
.NET