ローカルの実装のサンプル
重要
Visual Studio 2015 では、この方法での式エバリュエーターの実装は非推奨です。 CLR 式エバリュエーターの実装については、CLR 式エバリュエーターに関する記事とマネージド式エバリュエーターのサンプルに関する記事をご覧ください。
Visual Studio がメソッドのローカルを式エバリュエーター (EE) から取得する方法の概要を、以下に示します。
Visual Studio は、デバッグ エンジン (DE) の GetDebugProperty を呼び出して、ローカルを含むスタック フレームのすべてのプロパティを表す IDebugProperty2 オブジェクトを取得します。
IDebugStackFrame2::GetDebugProperty
は、Getmethodproperty を呼び出して、ブレークポイントが内部で発生したメソッドを説明するオブジェクトを取得します。 DE は、シンボル プロバイダー (IDebugSymbolProvider)、アドレス (IDebugAddress)、バインダー (IDebugBinder) を提供します。IDebugExpressionEvaluator::GetMethodProperty
は、提供されたIDebugAddress
オブジェクトで GetContainerField を呼び出し、指定されたアドレスを含むメソッドを表す IDebugContainerField を取得します。IDebugContainerField
インターフェイスは、IDebugMethodField インターフェイスについて照会されます。 このインターフェイスが、メソッドのローカルへのアクセスを提供します。IDebugExpressionEvaluator::GetMethodProperty
は、メソッドのローカルを表すIDebugProperty2
インターフェイスを実行するクラス (サンプルではCFieldProperty
と呼ばれます) をインスタンス化します。IDebugMethodField
オブジェクトは、IDebugSymbolProvider
、IDebugAddress
、およびIDebugBinder
の各オブジェクトと共に、このCFieldProperty
オブジェクトに配置されます。CFieldProperty
オブジェクトが初期化されると、IDebugMethodField
オブジェクトで GetInfo が呼び出されて、メソッド自体に関する表示可能なすべての情報を含む FIELD_INFO 構造が取得されます。IDebugExpressionEvaluator::GetMethodProperty
は、CFieldProperty
オブジェクトをIDebugProperty2
オブジェクトとして返します。Visual Studio は、
guidFilterLocalsPlusArgs
フィルターを使用して、返されたIDebugProperty2
オブジェクトで Enumchildren を呼び出し、メソッドのローカルを含む IEnumDebugPropertyInfo2 オブジェクトが返されます。 この列挙体は、Enumlocals と EnumArguments への呼び出しによって入力されます。Visual Studio は、 Next を呼び出して、各ローカルの DEBUG_PROPERTY_INFO 構造を取得します。 この構造には、ローカルの
IDebugProperty2
インターフェイスへのポインターが含まれています。Visual Studio は、各ローカルの GetPropertyInfo を呼び出して、ローカルの名前、値、および型を取得します。 この情報は、[ローカル] ウィンドウに表示されます。
このセクションの内容
「GetMethodProperty を実装する」では、GetMethodProperty の実装について説明します。
「ローカルを列挙する」では、デバッグ エンジン (DE) が呼び出しを行って、ローカルの変数または引数を列挙する方法を説明します。
「ローカル プロパティを取得する」では、DE が呼び出しを行って、1 つ以上のローカルの名前、型、および値を取得する方法を説明します。
「ローカル値を取得する」では、評価コンテキストで指定されたバインダー オブジェクトのサービスを必要とするローカルの値を取得する方法を説明します。
「ローカルを評価する」では、ローカルの評価方法を説明します。
関連セクション
「評価コンテキスト」では、DE が式エバリュエーター (EE) を呼び出すときに渡される引数を示します。
「MyCEE のサンプル」では、MyC 言語の式エバリュエーターを作成するための 1 つの実装方法を示します。