次の方法で共有


式エバリュエーターのアーキテクチャ

重要

Visual Studio 2015 では、この方法での式エバリュエーターの実装は非推奨です。 CLR 式エバリュエーターの実装については、CLR 式エバリュエーターに関する記事とマネージド式エバリュエーターのサンプルに関する記事をご覧ください。

独自の言語を Visual Studio デバッグ パッケージに統合するには、必要な式エバリュエーター (EE) インターフェイスを設定し、共通言語ランタイム シンボル プロバイダー (SP) とバインダー インターフェイスを呼び出す必要があります。 現在の実行アドレスと共に、SP とバインダーの各オブジェクトは、式が評価されるコンテキストです。 これらのインターフェイスによって生成および使用される情報は、EE のアーキテクチャの主要概念を表しています。

式の解析

プログラムをデバッグする際、式はさまざまな理由で、またデバッグ中のプログラムがブレークポイント (ユーザーによって設定されたブレークポイントまたは例外によって発生したブレークポイントのいずれか) で停止した場合は常に評価されます。 この時点で、Visual Studio ではデバッグ エンジン (DE) から IDebugStackFrame2 インターフェイスによって表されるスタック フレームが取得されます。 次に、Visual Studio では GetExpressionContext が呼び出され IDebugExpressionContext2 インターフェイスが取得されます。 このインターフェイスは、式を評価できるコンテキストを表します。Parsetext は、評価プロセスへのエントリ ポイントです。 この時点までに、すべてのインターフェイスが DE によって実装されます。

IDebugExpressionContext2::ParseText が呼び出されると、DE によって、ブレークポイントが発生したソース ファイルの言語に関連付けられている EE のインスタンスが作成されます (DE ではこの時点で SH のインスタンスも作成されます)。 EE は、IDebugExpressionEvaluator インターフェイスによって表されます。 次に、DE では Parse が呼び出され、式 (テキスト形式) が解析された式に変換されて、評価可能になります。 この解析された式は、IDebugParsedExpression インターフェイスによって表されます。 通常、式は解析されますが、この時点では評価されません。

DE では、IDebugExpression2 インターフェイスを実装するオブジェクトが作成され、IDebugParsedExpression オブジェクトが IDebugExpression2 オブジェクトに格納されて、IDebugExpressionContext2::ParseText から IDebugExpression2 オブジェクトが返されます。

式の評価

Visual Studio では、EvaluateSync または evaluateasync が呼び出されて、解析された式が評価されます。 これらのメソッドではいずれも EvaluateSync が呼び出され (IDebugExpression2::EvaluateSync ではメソッドがすぐに呼び出され、IDebugExpression2::EvaluateAsync ではバックグラウンド スレッドを通じてメソッドが呼び出されます)、解析された式が評価されて、解析された式の値と型を表す IDebugProperty2 インターフェイスが返されます。 IDebugParsedExpression::EvaluateSync では、提供された SH、アドレス、バインダーなどが使用されて、解析された式が、IDebugProperty2 インターフェイスによって表される実際の値に変換されます。

実行中のプログラムでブレークポイントに達した場合、ユーザーは [クイック ウォッチ] ダイアログ ボックスで変数を確認できます。 このダイアログ ボックスには、変数の名前、値、その型などが表示されます。 通常、ユーザーは値を変更できます。

[クイック ウォッチ] ダイアログ ボックスが表示されたら、検査対象の変数の名前がテキストとして ParseTextに送信されます。 これで、解析された式 (この場合は変数) を表す IDebugExpression2 オブジェクトが返されます。 その後、EvaluateSync が呼び出されて、変数の値と型、およびその名前を表す IDebugProperty2 オブジェクトが生成されます。 これが表示される情報です。

ユーザーが変数の値を変更すると、SetValueAsString が新しい値で呼び出されます。これで、メモリ内の変数の値が変更され、プログラムの実行の再開時に使用されるようになります。

変数の値を表示するこのプロセスの詳細については、ローカルの表示に関するページを参照してください。 変数の値の変更方法の詳細については、ローカルの値の変更に関するページを参照してください。

このセクションの内容

評価コンテキスト」では、DE で EE が呼び出される際に渡される引数を参照できます。

キー式エバリュエーター インターフェイス」では、EE を記述する際に必要な重要インターフェイスと評価コンテキストについて説明します。