ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#-多态类上的Func-eval

2019-11-18 09:15:43  阅读:309  来源: 互联网

标签:clr cil c mdbg imetadataimport


我正在使用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时,我得到一个类而不是基类.
此时,我无法再区分要调用哪个方法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
        );

解决方法:

将对象强制转换为基类并不会改变对象的类型,只会改变其感知方式.我建议您需要将“感知”类型与值一起传递,并使用它来代替实际类型,以查找正确的方法.

“感知”类型是基于从何处获取值的静态确定的类型.

>如果使用ICorDebugILFrame :: GetArgument()从参数中获取值,则从方法签名中提取相应的参数类型.

>如果其第一个参数和方法签名具有HasThis标志,但没有ExplicitThis标志,则改为从值中获取类型.

>如果使用ICorDebugILFrame :: GetLocalVariable()从本地获取值,则从本地签名方法中提取类型(本地签名的元数据令牌需要从方法头中提取).
>如果通过使用ICorDebugEval运行方法(例如,属性获取器)获得了值,则应使用调用的方法的返回类型(也从方法签名中提取).
>如果您从字段中获取值,则从字段签名中提取类型.
>如果要强制转换值,则可以使用任何强制类型.

标签:clr,cil,c,mdbg,imetadataimport
来源: https://codeday.me/bug/20191118/2027249.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有