Visual Studio 拡張機能パッケージのカスタム ツール ウィンドウは、VS2012 および VS2013 のデバッグ セッション中にカスタム式を評価することになっています。最終的な目標は、グラフィカルなウォッチ ウィンドウを構築することです。したがって、式の結果の値をデバッグ エンジンからフェッチする必要があります。
評価は正常に機能します
IDebugStackFrame2 -> IDebugExpressionContext2 -> ParseText
IDebugExpression2 -> EvaluateSync -> IDebugProperty2
ここでの最初の問題: Visual Studio 2013ParseText()
ではエラーが正しく報告されません。ただし、IDebugProperty2
取得したものは有効です (有効な式の場合)。VS2012 では、無効な式に対して適切なエラーが発生します。
ここから本当の問題が始まります。結果の Property2 は、複雑なカスタム オブジェクトを表します。それを視覚化するには、その基本クラスの 1 つから特定のプロパティを取得する必要があります。私の現在の試みではIDebugProperty2.EnumChildren()
、Visual Studio の [ローカル] ウィンドウで行うのと同じように、メンバーをクラス階層の適切な場所まで移動するために使用しています。
[result] -> base -> Raw -> base -> Non-public Members -> [private field] ... a.s.o.
これは何とか機能しますが、次の問題が発生します。
問題 1: 複雑なオブジェクトの内部メンバーを取得する
EnumChildren() から受け取ったメンバーとその順序は、いくつかの要因に依存しているように見えますが、それは私には明らかではありません: * オブジェクトに Debug Visualizer が接続されていますか? (VS2013 は EnumChildren の enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_VALUE_RAW を無視し、美化されたバージョン + 「Raw View」ノードを返します。VS2012 は期待どおりに動作します) *「非公開メンバー」ノードは表示されていますか? ある場合もあるし、ない場合もある - 依存するものからはわからない?
これは、複雑な式の結果オブジェクトの内部メンバーを取得する非常にハックな方法であることが判明しました。より良い方法は何ですか?IDebugProperty3 といくつかのデバッガ ビジュアライザのトリックを使用していますか? どんなポインタでも素晴らしいでしょう。
問題 2: VS2012 がメモリ バイトの提供に失敗する
結果オブジェクトのプライベート メンバーをIDebugProperty2.GetMemoryBytes()
取得したら、その値 (プレーンな System.Array) を「シリアル化」し、カスタム ツール ウィンドウに転送するために使用します。これは VS2013 では機能しますが、VS2012 ではIDebugProperty2.GetMemoryBytes()
常に VS_Constants.S_FALSE を返します。私はここで本当にアイデアがありません。VS2012 にはメモリ ウィンドウがあるため、ここでもこれを機能させる方法が必要ですか? 私は何が欠けていますか?
メモリ API のクエリに使用されるコード:
IDebugMemoryContext2 memCtx = null;
IDebugMemoryBytes2 memBytes = null;
// getting the memory context is working ok
if (tmpProperty2.GetMemoryContext(out memCtx) == VSConstants.S_OK
// VS2012 fails here, always returns S_FALSE, memBytes remains null:
&& (tmpProperty2.GetMemoryBytes(out memBytes) == VSConstants.S_OK)) {
...
もう少しコンテキスト:
OS: Windows 8 and 8.1
Visual Studio: 2012 / 2013
Tool Window built with MPF (C#) in VS2013, (removed all vers. 12 references from the package before deploying to VS2012)
Debug engines: C# and Visual Basic