将MonoObject强制转换为MonoClass(方法调用返回一个类型)

时间:2011-12-13 01:47:26

标签: .net mono embedded

我有一个返回Type的方法调用。我想利用这个类型并从C ++中做一些反思。有这样的代码:

MonoClass* klass = (MonoClass*)mono_runtime_invoke (...);

我很确定转向MonoClass*是不合适的。该函数返回MonoObject*。如何强制包含对TypeMonoClass*的引用的MonoObject *。我希望能够致电:

mono_class_get_properties (type, &iter)

迭代地,稍后。

2 个答案:

答案 0 :(得分:3)

解决方案1 ​​

如果您可以访问.NET代码,最简单的方法是返回类型的TypeHandle。在本机代码中,您可以通过取消装箱调用的结果来访问MonoType

在C#中:

static IntPtr GetUnderlyingTypeHandle()
{
    Type type;
    // ...
    return type.TypeHandle.Value;
}

在本机代码中:

MonoMethod *method = ...; // Retrieve the method to call
MonoObject *obj = mono_runtime_invoke(method, NULL, NULL, NULL);
MonoType *underlyingType = *(MonoType **) mono_object_unbox(obj);

解决方案2

如果您无法更改.NET代码,则必须使用本机代码调用TypeHandleValue getter。

答案 1 :(得分:1)

在C#代码中,您可以返回type.TypeHandle(当然您需要更改方法签名的返回类型),然后您可以取消装箱mono_runtime_invoke()返回值(始终是对象)并将指针强制转换为MonoType *。获得MonoType *后,您可以根据需要使用mono_class_from_mono_type()或mono_type_get_class()获取MonoClass *。

如果你不能改变C#代码,你也可以从C语言中使用mono_runtime_invoke()get_TypeHandle()方法。