如何在评估方法签名的上下文中使用MonoType

时间:2011-10-27 19:34:46

标签: mono embedding

我希望能够从C ++调用CLR类的方法。特别是某些类可能包含重载方法,因此我需要根据方法名称和参数签名搜索类的方法。

我有这样的功能:

MonoMethod* find_method (
    MonoDomain* domain, 
    MonoClass* type, 
    const char* name, 
    int nargs,
    MonoClass** types)    

我遍历类的成员,按名称查找匹配的成员。然后我需要检查方法的参数,看看它们是否与此函数的types参数中所需的列表匹配。

然后使用

mono_signature_get_params()来迭代具有匹配名称的每个方法的参数。

问题: 我该怎么做:

  1. 访问MonoClass和MonoType结构字段
    • 尝试访问这些结构中的字段会导致错误,因为结构不完整
  2. 将方法参数列表与作为函数输入提供的另一个列表进行比较
    • 无法通过枚举进行比较,因为无法访问枚举字段(参见上文)
  3. 获取基本类型MonoClass*的{​​{1}}常量等。
    • 希望能够使用基本类型类常量轻松编写签名数组
  4. 以下是2个辅助函数,在访问MonoType *或MonoClass *中的字段时无法编译,编译器抱怨表明这两个结构不完整:

    int32_class, int64_class

1 个答案:

答案 0 :(得分:2)

您不得包含私人单声道标题:当我们对内部进行更改时,您的应用会中断。

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

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

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

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