如何在评估方法签名的上下文中使用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()
然后使用匹配名称迭代每个方法的参数
问题:
我怎样才能做到以下几点:
- 试图访问这些结构中的字段会导致错误,因为结构不完整
- 无法按枚举进行比较,因为无法访问枚举字段(请参见上文)
int32\u类、int64\u类
等的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开发社区提出这个问题,因为正常使用不允许与这些数据结构交互。