【发布时间】:2016-08-08 07:52:21
【问题描述】:
我正在使用 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 时,我得到的是 A 类而不是 Base 类。 那时我无法再区分调用哪个方法 get_SomeProp 了。我希望 ICorDebugValue2::GetExactType 考虑执行的强制转换,而不总是返回底层类型。
我如何理解我应该调用哪个方法?
下面列出了我现在正在做的一些代码。 mdbgValue 表示 castedToBase 对象。 szTypedef 返回“A”而不是预期的“Base”
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
);
【问题讨论】:
-
将对象转换为它的基类不会改变对象,只会改变它的感知方式。我建议您需要将“感知”类型与值一起传递,并使用它而不是实际类型来找到正确的方法。
-
@BrianReichle 感谢您的建议!但是我没有“感知”类型,调试器应该如何知道对对象执行了什么转换?
-
也许“静态确定类型”比“感知”类型更好。您可以从获得值的任何地方获取它(字段类型、参数类型、方法/属性返回类型等......)
-
@BrianReichle 你的意思是编译器时间类型吗?所以为了得到它,我应该以某种方式调用 roslyn,给它我的运行时已知的类名、方法名和变量名来获取静态类型?
-
不,当我说“静态确定类型”时,我指的是通过查看代码/元数据而不是通过运行它或检查当前执行状态获得的类型。所以如果从参数中获取值,静态确定的类型就是参数的类型。如果你从一个属性中得到它,那么它就是属性的类型。
标签: c# clr cil mdbg imetadataimport