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
);