3

MDBG サンプルを使用してマネージド .NET デバッガーを作成しています。

MDBG サンプルは、指定されたインスタンスの最上位クラスでのみ動作し、クラス階層の奥深くを検索しません。階層を調べて、利用可能なすべてのメソッドを取得できました。しかし、そのような場合に問題が発生します。

    public abstract class Base{
        public Base() {SomeProp = "Base"}
        public string SomeProp {get;set;}
    }

    public class A : Base{
        public Base() {SomeProp = "A"}
        public new string SomeProp {get;set;}
    }

    public static void Main(){
        var a = new A();
        var castedToBase = (Base)a;
        //castedToBase.SomeProp -- expect result to be "Base" when debugging
    }

問題は、castedToBase を ICorDebugValue として取得し、その ICorDebugValue2::GetExactType を照会するときに、Base クラスではなく A クラスを取得することです。その時点で、get_SomeProp を呼び出すメソッドを区別できなくなりました。ICorDebugValue2::GetExactType は、実行されたキャストを考慮し、基になる型を常に返すとは限りません。

どのメソッドを呼び出す必要があるかを理解するにはどうすればよいですか?

私が今やっているコードの一部を以下に示します。mdbgValueは castedToBase オブジェクトを表します。szTypedef は、予期される "Base" ではなく "A" を返します。

    IMetadataImport importer;
    var classToken = mdbgValue.CorValue.ExactType.Class.Token;

    int size;
    int ptkExtends;
    TypeAttributes pdwTypeDefFlags;
    importer.GetTypeDefProps(classToken,
        null,
        0,
        out size,
        out pdwTypeDefFlags,
        out ptkExtends
        );
    StringBuilder szTypedef = new StringBuilder(size);
    importer.GetTypeDefProps(classToken,
        szTypedef,
        szTypedef.Capacity,
        out size,
        out pdwTypeDefFlags,
        out ptkExtends
        );
4

1 に答える 1

3

オブジェクトをその基本クラスにキャストしても、オブジェクトのタイプは変更されず、オブジェクトがどのように認識されるかだけが変更されます。「認識された」タイプを値とともに渡し、正しいメソッドを見つけるために実際のタイプの代わりにそれを使用する必要があることをお勧めします。

「知覚」タイプは、値の取得元に基づいて静的に決定されるタイプです。

  • を使用してパラメーターから値を取得した場合はICorDebugILFrame::GetArgument()、対応する引数の型をメソッド シグネチャから抽出します。
    • 最初の引数で、メソッド シグネチャにフラグがあるHasThisがフラグがない場合は、ExplicitThis代わりに値から型を取得します。
  • ローカルを使用して値を取得した場合はICorDebugILFrame::GetLocalVariable()、メソッドのローカル署名から型を抽出します (ローカル署名のメタデータ トークンはメソッド ヘッダーから抽出する必要があります)。
  • メソッドを実行して値を取得した場合ICorDebugEval(プロパティ ゲッターなど)、呼び出したメソッドの戻り値の型を使用する必要があります (これもメソッド シグネチャから抽出されます)。
  • フィールドから値を取得した場合は、フィールド シグネチャから型を抽出します。
  • 値をキャストする場合は、キャスト先の型を使用してください。
于 2016-08-08T11:58:53.077 に答える