приведение MonoObject к MonoClass (где вызов метода возвращает тип) - PullRequest
2 голосов
/ 13 декабря 2011

У меня есть вызов метода, который возвращает Type. Я хочу использовать тип и сделать некоторые отражения от C ++. Код такой:

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

Я почти уверен, что приведение к MonoClass* не подходит. Функция возвращает MonoObject*. Как заставить MonoObject *, содержащий ссылку от Type до MonoClass*. Я хочу иметь возможность звонить:

mono_class_get_properties (type, &iter)

итеративно, позже.

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

Раствор 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, вам необходимо вызвать геттеры TypeHandle и Value в собственном коде.

1 голос
/ 13 декабря 2011

В коде C # вы можете вернуть type.TypeHandle (конечно, вам нужно изменить тип возвращаемого значения сигнатуры метода), а затем вы можете распаковать возвращаемое значение mono_runtime_invoke () (которое всегда является объектом) и привести указатель к MonoType.*.Если у вас есть MonoType *, вы можете получить MonoClass * с помощью mono_class_from_mono_type () или mono_type_get_class (), в зависимости от ситуации.

Если вы не можете изменить код C #, вы можете mono_runtime_invoke () get_TypeHandle ()метод из C, а также.

...