Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在评估方法签名的上下文中使用MonoType 我希望能够从C++调用CLR类的方法。特别是某些类可能包含重载方法,因此我需要根据方法名和参数签名搜索类的方法_Mono_Embedding - Fatal编程技术网

如何在评估方法签名的上下文中使用MonoType 我希望能够从C++调用CLR类的方法。特别是某些类可能包含重载方法,因此我需要根据方法名和参数签名搜索类的方法

如何在评估方法签名的上下文中使用MonoType 我希望能够从C++调用CLR类的方法。特别是某些类可能包含重载方法,因此我需要根据方法名和参数签名搜索类的方法,mono,embedding,Mono,Embedding,我有这样一个函数: MonoMethod* find_method ( MonoDomain* domain, MonoClass* type, const char* name, int nargs, MonoClass** types) 我迭代类的成员,按名称查找匹配的成员。然后,我需要检查该方法的参数,看看它们是否匹配该函数的types参数中所需的列表 mono\u signature\u get\u params()然后使用匹配名称

我有这样一个函数:

MonoMethod* find_method (
    MonoDomain* domain, 
    MonoClass* type, 
    const char* name, 
    int nargs,
    MonoClass** types)    
我迭代类的成员,按名称查找匹配的成员。然后,我需要检查该方法的参数,看看它们是否匹配该函数的types参数中所需的列表

mono\u signature\u get\u params()
然后使用匹配名称迭代每个方法的参数

问题: 我怎样才能做到以下几点:

  • 访问MonoClass和MonoType结构字段
    • 试图访问这些结构中的字段会导致错误,因为结构不完整
  • 将方法参数列表与作为函数输入提供的另一个列表进行比较
    • 无法按枚举进行比较,因为无法访问枚举字段(请参见上文)
  • 获取基本类型
    int32\u类、int64\u类
    等的
    MonoClass*
    常量。
    • 希望能够使用基元类型类常量轻松组合签名数组
  • 以下是两个辅助函数,当访问MonoType*或MonoClass*中的字段时,它们的编译方式不同,编译器抱怨这两个结构不完整:

    //
    //  Detetermine whether classes A and B are equivalent
    //
    static bool IsEquivalent (MonoType* typeA, MonoType* typeB)
    {
        MonoTypeEnum Ta = typeA->type; 
        MonoTypeEnum Tb = typeB->type;
    
        // if basic type not a match, can punt
        if (Ta != Tb)
            return false;
    
        // if simple type, nothing further to check 
        if (Ta < MONO_TYPE_PTR)
            return true;
    
        // check class
        if (Ta == MONO_TYPE_CLASS)
            return typeA->data.klass = typeB->data.klass;
        else
            return typeA->data.klass = typeB->data.klass;        
    }
    
    
    //
    //  Determine whether parameters in signature match incoming parameters
    //
    static bool types_match (
        MonoMethodSignature* sig, 
        MonoClass** types, 
        int nargs)
    {
        void* iter = NULL;
        MonoType* type = NULL;
    
        int i = 0;
        while (type = mono_signature_get_params (sig, &iter))
        {
            if (!IsEquivalent (type, types[i++]->this_arg))
                return false;
        }
    
        return true;
    }
    
    //
    //确定A类和B类是否等效
    //
    静态布尔是等效的(单型*A型,单型*B型)
    {
    MonoTypeEnum Ta=typeA->type;
    MonoTypeEnum Tb=typeB->type;
    //如果基本类型不匹配,可以下注
    如果(Ta!=Tb)
    返回false;
    //如果是简单类型,则无需进一步检查
    如果(Ta<单声道类型\u PTR)
    返回true;
    //检查类
    如果(Ta==MONO_类型_类)
    返回typeA->data.klass=typeB->data.klass;
    其他的
    返回typeA->data.klass=typeB->data.klass;
    }
    //
    //确定签名中的参数是否与传入参数匹配
    //
    静态布尔类型匹配(
    单方法签名*sig,
    单层**类型,
    内特(纳格斯)
    {
    void*iter=NULL;
    MonoType*type=NULL;
    int i=0;
    while(type=mono\u签名\u get\u参数(sig和iter))
    {
    if(!IseEquivalent(type,types[i++]->this_arg))
    返回false;
    }
    返回true;
    }
    
    您不能包含私有mono头:当我们对内部进行更改时,您的应用程序将中断

    要从MonoType*访问类型枚举值,需要调用mono_type_get_type()函数(来自metadata/metadata.h)。对于MONO_TYPE_类和MONO_TYPE_值类型,您可以使用MONO_TYPE_get_类()访问MONO类*值

    要比较两个签名是否相等,可以使用mono_metadata_signature_equal():请注意,使用MonoClass*表示参数的类型从根本上是不正确的,因为它不能表示(例如)通过引用传递的参数

    如果需要通过可分配性进行匹配,可以使用mono_class_is_assignable_from(),但请注意,您需要处理byref参数,决定是否允许枚举类型自动转换为其基础整数类型等

    基本类型类可以通过以下函数轻松检索:
    mono_get_int32_class()、mono_get_boolean_class()等。

    好的,这个问题看起来是mono公开给公众消费的内容与内部消费的内容有关。包含内部头解决了编译问题。听起来我需要向mono开发社区提出这个问题,因为正常使用不允许与这些数据结构交互。