制約された実行領域Constrained Execution Regions

制約された実行領域 (CER) は、信頼性のあるマネージド コードを作成するための機構の一部です。A constrained execution region (CER) is part of a mechanism for authoring reliable managed code. CER は、領域内のコードが領域全体で実行されるのを防ぐ帯域外の例外を、共通言語ランタイム (CLR) がスローすることが制約された領域を定義します。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. その領域内では、ユーザー コードは、帯域外の例外がスローされることになるコードの実行を制約されます。Within that region, user code is constrained from executing code that would result in the throwing of out-of-band exceptions. PrepareConstrainedRegions メソッドは try ブロックの直前にある必要があります。このメソッドによって、catchfinallyfault の各ブロックが制約された実行領域としてマークされます。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.

制約された実行領域は、注釈付きの try ブロックだけでなく、特に CriticalFinalizerObject クラスから派生したクラス、および ExecuteCodeWithGuaranteedCleanup メソッドを使用して実行されるコードで実行するクリティカル ファイナライザーなど、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. JIT コンパイル時や型の読み込み時に、CLR がメモリ不足の状態を引き起こさないように、事前準備が必要となります。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.

  • ボックス化。Boxing.

  • ロックの取得。Acquiring a lock.

  • 準備されていないメソッドの仮想呼び出し。Calling unprepared methods virtually.

  • 信頼性の低いコントラクトまたは信頼性のないコントラクトでのメソッド呼び出し。Calling methods with a weak or nonexistent reliability contract.

.NET Framework Version 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:

  • MayFailMayFail. 例外的な条件下で、メソッドは失敗する可能性があります。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.

  • NoneNone. メソッド、型、またはアセンブリには 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.

  • SuccessSuccess. 例外的な条件下で、メソッドは成功することが保証されます。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. たとえば、Count を ReliabilityContractAttribute(Cer.Success) でマークした場合、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:

  • MayCorruptAppDomainMayCorruptAppDomain. 例外的な条件下で、共通言語ランタイム (CLR) は、現在のアプリケーション ドメインにおける状態の一貫性に関して一切保証しません。Under exceptional conditions, the common language runtime (CLR) makes no guarantees regarding state consistency in the current application domain.

  • MayCorruptInstanceMayCorruptInstance. 例外的な条件下で、メソッドは状態の破損を現在のインスタンスに限定することが保証されます。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.

  • WillNotCorruptStateWillNotCorruptState. 例外的な条件下で、メソッドは状態を破損しないことが保証されます。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.

SafeHandle および CriticalHandle から継承するすべての型は、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.

  • ボックス化。Boxing.

  • 多次元配列アクセス。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.

  • 関数ポインターとデリゲート。Function pointers and delegates.

関連項目See also