重要
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 は、返された
IDebugProperty2
オブジェクト EnumChildren をフィルターguidFilterLocalsPlusArgs
で呼び出します。これは、メソッドのローカルを含む IEnumDebugPropertyInfo2 オブジェクトを返します。 この列挙は、EnumLocals および EnumArguments呼び出しによって入力されます。Visual Studio Next を呼び出して、各ローカルの DEBUG_PROPERTY_INFO 構造を取得します。 この構造体には、ローカルの
IDebugProperty2
インターフェイスへのポインターが含まれています。Visual Studio は、各ローカル GetPropertyInfo を呼び出して、ローカルの名前、値、および型を取得します。 この情報は、ローカル ウィンドウに表示されます。
このセクションの内容
「GetMethodProperty を実装する」では、GetMethodProperty の実装について説明します。
ローカルの列挙 デバッグ エンジン (DE) がローカル変数または引数を列挙する呼び出しを行う方法について説明します。
ローカル プロパティの取得、DE が 1 つ以上のローカルの名前、型、および値を取得する呼び出しを行う方法について説明します。
ローカル値を取得、ローカルの値を取得する方法について説明します。ローカルの値を取得するには、評価コンテキストによって指定されたバインダー オブジェクトのサービスが必要です。
ローカルの評価 ローカルの評価方法について説明します。
関連セクション
評価コンテキスト は、DE が式エバリュエーター (EE) を呼び出すときに渡される引数を提供します。
MyCEE サンプル では、MyC 言語の式エバリュエーターを作成するための 1 つの実装アプローチを示します。