제약이 있는 실행 영역Constrained Execution Regions

CER(제약이 있는 실행 영역)은 신뢰할 수 있는 관리 코드를 작성하기 위한 메커니즘에 포함됩니다.A constrained execution region (CER) is part of a mechanism for authoring reliable managed code. CER은 CLR(공용 언어 런타임 지원)이 영역의 전체 코드가 실행되지 않도록 하는 대역 외 예외를 throw하지 못하도록 제한되는 영역을 정의합니다.A CER defines an area in which the common language runtime (CLR) is constrained from throwing out-of-band exceptions that would prevent the code in the area from executing in its entirety. 해당 영역 내에서 사용자 코드는 대역 외 예외 throw를 초래하는 실행이 제한됩니다.Within that region, user code is constrained from executing code that would result in the throwing of out-of-band exceptions. PrepareConstrainedRegions 메서드는 try 블록 바로 앞에 와야 하고 catch, finallyfault 블록을 제약이 있는 실행 영역으로 표시합니다.The PrepareConstrainedRegions method must immediately precede a try block and marks catch, finally, and fault blocks as constrained execution regions. 제약이 있는 영역으로 표시된 후 코드는 강한 안정성 계약을 사용하여 다른 코드를 호출해야 하고 코드는 실패를 처리할 준비가 된 경우에만 준비되지 않거나 신뢰할 수 없는 메서드에 대한 가상 호출을 할당하거나 수행할 수 있습니다.Once marked as a constrained region, code must only call other code with strong reliability contracts, and code should not allocate or make virtual calls to unprepared or unreliable methods unless the code is prepared to handle failures. CLR은 CER에서 실행되는 코드의 스레드 중단을 지연합니다.The CLR delays thread aborts for code that is executing in a CER.

제약이 있는 실행 영역은 ExecuteCodeWithGuaranteedCleanup 메서드를 사용하여 실행된 CriticalFinalizerObject 클래스 및 코드에서 파생된 클래스에서 실행되는 특히 중요한 종료자인 주석이 달린 try 블록 이외에 CLR의 다양한 형식으로 사용됩니다.Constrained execution regions are used in different forms in the CLR in addition to an annotated try block, notably critical finalizers executing in classes derived from the CriticalFinalizerObject class and code executed using the ExecuteCodeWithGuaranteedCleanup method.

CER 사전 준비CER Advance Preparation

CLR은 메모리 부족 조건을 피하기 위해 사전에 CER을 준비합니다.The CLR prepares CERs in advance to avoid out-of-memory conditions. CLR이 Just-In-Time 컴파일 또는 형식 로딩 중에 메모리 부족 조건을 초래하지 않으려면 사전 준비가 필요합니다.Advance preparation is required so the CLR does not cause an out of memory condition during just-in-time compilation or type loading.

개발자는 코드 영역이 CER임을 나타내야 합니다.The developer is required to indicate that a code region is a CER:

제약 조건Constraints

사용자는 CER에서 작성할 수 있는 코드 형식이 제한됩니다.Users are constrained in the type of code they can write in a CER. 코드는 다음 작업에서 발생할 수 있는 것과 같은 대역 외 예외를 초래할 수 없습니다.The code cannot cause an out-of-band exception, such as might result from the following operations:

  • 명시적 할당Explicit allocation.

  • BoxingBoxing.

  • 잠금 획득Acquiring a lock.

  • 가상으로 준비되지 않은 메서드 호출Calling unprepared methods virtually.

  • 약하거나 존재하지 않는 안전성 계약을 사용하여 메서드 호출Calling methods with a weak or nonexistent reliability contract.

.NET Framework 버전 2.0에서 이러한 제약 조건은 지침입니다.In the .NET Framework version 2.0, these constraints are guidelines. 진단은 코드 분석 도구를 통해 제공됩니다.Diagnostics are provided through code analysis tools.

안정성 계약Reliability Contracts

ReliabilityContractAttribute는 특정 메서드의 안전성 보장 및 손상 상태를 설명하는 사용자 지정 특성입니다.The ReliabilityContractAttribute is a custom attribute that documents the reliability guarantees and the corruption state of a given method.

안전성 보장Reliability Guarantees

Cer 열거 값을 통해 표현되는 안전성 보장은 특정 메서드의 안정성 정도를 나타냅니다.Reliability guarantees, represented by Cer enumeration values, indicate the degree of reliability of a given method:

  • MayFail.MayFail. 예외 조건에서 메서드가 실패할 수 있습니다.Under exceptional conditions, the method might fail. 이 경우 메서드는 성공 여부를 호출 메서드에 다시 보고합니다.In this case, the method reports back to the calling method whether it succeeded or failed. 반환 값을 보고할 수 있으려면 메서드가 CER에 포함되어야 합니다.The method must be contained in a CER to ensure that it can report the return value.

  • None.None. 메서드, 형식 또는 어셈블리에는 CER 개념이 없으며 상태 손상으로 인한 큰 완화 없이 CER 내에서 호출하기에 안전하지 않을 수 있습니다.The method, type, or assembly has no concept of a CER and is most likely not safe to call within a CER without substantial mitigation from state corruption. CER 보장의 장점을 활용하지 못합니다.It does not take advantage of CER guarantees. 이것은 다음을 의미합니다.This implies the following:

    1. 예외 조건에서 메서드가 실패할 수 있습니다.Under exceptional conditions the method might fail.

    2. 메서드는 실패 사실을 보고할 수도 있고 보고하지 않을 수도 있습니다.The method might or might not report that it failed.

    3. 메서드는 CER을 사용하도록 작성되지 않을 가능성이 큽니다.The method is not written to use a CER, the most likely scenario.

    4. 메서드, 형식 또는 어셈블리가 성공한 것으로 명시적으로 식별되지 않으면 암시적으로 None으로 식별됩니다.If a method, type, or assembly is not explicitly identified to succeed, it is implicitly identified as None.

  • Success.Success. 예외 조건에서 메서드가 성공하도록 보장됩니다.Under exceptional conditions, the method is guaranteed to succeed. 이 안전성 수준을 획득하려면 CER이 아닌 영역 내에서 호출되는 경우에도 항상 호출되는 메서드 주위에 CER을 생성해야 합니다.To achieve this level of reliability you should always construct a CER around the method that is called, even when it is called from within a non-CER region. 성공을 주관적으로 볼 수 있더라도 메서드가 의도된 작업을 수행하면 성공한 것입니다.A method is successful if it accomplishes what is intended, although success can be viewed subjectively. 예를 들어 ReliabilityContractAttribute(Cer.Success)를 사용하여 Count를 표시하는 것은 CER에서 실행되는 경우 항상 ArrayList에 있는 요소 수를 반환하고 내부 필드를 결정되지 않은 상태로 남겨 두지 않음을 의미합니다.For example, marking Count with ReliabilityContractAttribute(Cer.Success) implies that when it is run under a CER, it always returns a count of the number of elements in the ArrayList and it can never leave the internal fields in an undetermined state. 그러나 성공의 경우 값이 경합 상태로 인해 새 값으로 대체될 수 없음을 의미할 수도 있다는 것을 이해하면 CompareExchange 메서드가 성공으로도 표시됩니다.However, the CompareExchange method is marked as success as well, with the understanding that success may mean the value could not be replaced with a new value due to a race condition. 핵심 포인트는 메서드가 설명된 방식대로 동작하고 CER 코드가 올바르지만 신뢰할 수 없는 코드가 어떻게 보이는지에 관계없이 비정상적인 동작을 예상하도록 작성될 필요가 없다는 것입니다.The key point is that the method behaves in the way it is documented to behave, and CER code does not need to be written to expect any unusual behavior beyond what correct but unreliable code would look like.

손상 수준Corruption levels

Consistency 열거 값을 통해 표현되는 손상 수준은 상태가 특정 환경에서 손상될 수 있는 정도를 나타냅니다.Corruption levels, represented by Consistency enumeration values, indicate how much state may be corrupted in a given environment:

  • MayCorruptAppDomain.MayCorruptAppDomain. 예외 조건에서 CLR(공용 언어 런타임)이 현재 애플리케이션 도메인에서 상태 일관성에 관한 보장을 하지 않습니다.Under exceptional conditions, the common language runtime (CLR) makes no guarantees regarding state consistency in the current application domain.

  • MayCorruptInstance.MayCorruptInstance. 예외 조건에서 메서드가 상태 손상을 현재 인스턴스로 제한하도록 보장합니다.Under exceptional conditions, the method is guaranteed to limit state corruption to the current instance.

  • MayCorruptProcess. 예외 조건에서 CLR은 상태 일관성에 관한 보장을 하지 않습니다. 즉, 조건이 프로세스를 손상시킬 수 있습니다.MayCorruptProcess, Under exceptional conditions, the CLR makes no guarantees regarding state consistency; that is, the condition might corrupt the process.

  • WillNotCorruptState.WillNotCorruptState. 예외 조건에서 메서드가 상태를 손상시키지 않도록 보장합니다.Under exceptional conditions, the method is guaranteed not to corrupt state.

안전성 try/catch/finallyReliability try/catch/finally

안전성 try/catch/finally는 관리되지 않는 버전과 동일한 수준의 예측 가능성 보장을 사용하는 예외 처리 메커니즘입니다.The reliability try/catch/finally is an exception handling mechanism with the same level of predictability guarantees as the unmanaged version. catch/finally 블록은 CER입니다.The catch/finally block is the CER. 블록에 있는 메서드의 경우 사전 준비가 필요하고 중단할 수 없어야 합니다.Methods in the block require advance preparation and must be noninterruptible.

.NET Framework 버전 2.0에서 코드는 try 블록 바로 전에 PrepareConstrainedRegions를 호출하여 try를 신뢰할 수 있음을 런타임에 알립니다.In the .NET Framework version 2.0, code informs the runtime that a try is reliable by calling PrepareConstrainedRegions immediately preceding a try block. PrepareConstrainedRegions는 컴파일러 지원 클래스인 RuntimeHelpers의 멤버입니다.PrepareConstrainedRegions is a member of RuntimeHelpers, a compiler support class. 컴파일러를 통해 가성을 보류하여 직접 PrepareConstrainedRegions를 호출합니다.Call PrepareConstrainedRegions directly pending its availability through compilers.

중단할 수 없는 영역Noninterruptible Regions

중단할 수 없는 영역은 명령 집합을 CER로 그룹화합니다.A noninterruptible region groups a set of instructions into a CER.

.NET Framework 버전 2.0에서 컴파일러 지원을 통해 가용성을 보류하면 사용자 코드는 PrepareConstrainedRegions 메서드 호출 뒤에 빈 try/catch가 포함된 신뢰할 수 있는 try/catch/finally를 사용하여 중단할 수 없는 영역을 만듭니다.In .NET Framework version 2.0, pending availability through compiler support, user code creates non-interruptible regions with a reliable try/catch/finally that contains an empty try/catch block preceded by a PrepareConstrainedRegions method call.

중요 종료자 개체Critical Finalizer Object

CriticalFinalizerObject는 가비지 수집이 종료자를 실행하도록 보장합니다.A CriticalFinalizerObject guarantees that garbage collection will execute the finalizer. 할당 시 종료자 및 해당 호출 그래프는 사전에 준비됩니다.Upon allocation, the finalizer and its call graph are prepared in advance. 종료자 메서드는 CER에서 실행되고 CER 및 종료자에 대한 모든 제약 조건을 따라야 합니다.The finalizer method executes in a CER, and must obey all the constraints on CERs and finalizers.

SafeHandleCriticalHandle에서 상속되는 모든 형식은 CER 내에 종료자 실행이 포함되도록 보장합니다.Any types inheriting from SafeHandle and CriticalHandle are guaranteed to have their finalizer execute within a CER. 핸들을 해제하는 데 필요한 코드를 실행하도록 SafeHandle 파생 클래스에서 ReleaseHandle을 구현합니다.Implement ReleaseHandle in SafeHandle derived classes to execute any code that is required to free the handle.

CER에서 허용되지 않는 코드Code Not Permitted in CERs

다음 작업은 CER에서 허용되지 않습니다.The following operations are not permitted in CERs:

  • 명시적 할당.Explicit allocations.

  • 잠금 획득Acquiring a lock.

  • BoxingBoxing.

  • 다차원 배열 액세스.Multidimensional array access.

  • 리플렉션을 통한 메서드 호출.Method calls through reflection.

  • Enter 또는 LockEnter or Lock.

  • 보안 검사.Security checks. 링크 요청만 수행하지 않습니다.Do not perform demands, only link demands.

  • COM 개체 및 프록시에 대한 IsinstCastclassIsinst and Castclass for COM objects and proxies

  • 투명 프록시에 대한 필드 가져오기 또는 설정.Getting or setting fields on a transparent proxy.

  • serialization.Serialization.

  • 함수 포인터 및 대리자.Function pointers and delegates.

참고자료See also