По крайней мере, одна проблема заключается в том, что вы помещаете ссылку "this" (OpCodes.Ldarg_0
) в стек, даже если он никогда не извлекается (поскольку вы вызываете метод static ).Я бы попытался удалить эту строку и посмотреть, будет ли она вести себя лучше.
Другая проблема заключается в том, что вы передаете new Type[] { returnType }
методу EmitCall
.Это предназначено для необязательных аргументов (params
), и я подозреваю, что ваш метод на самом деле не имеет никаких параметров.Следовательно, вам также следует удалить этот аргумент.
Редактировать:
На основе комментариев вы пытаетесь передать объект System.Type
, статически известный методувы вызываете динамически.Это возможно, но вам нужно прыгнуть через пару обручей.
Получить ссылку на MethodInfo
для метода Type.GetTypeFromHandle
:
MethodInfo getTypeFromHandle = typeof(Type).GetMethod("GetTypeFromHandle");
Используйте следующие строки IL, чтобы поместить ваш returnType
в стек:
gen.Emit(OpCodes.Ldtoken, returnType);
gen.Emit(OpCodes.Call, getTypeFromHandle);
В итоге ваш код должен выглядеть следующим образом:
MethodInfo getTypeFromHandle = typeof(Type).GetMethod("GetTypeFromHandle");
gen.Emit(OpCodes.Ldtoken, returnType);
gen.Emit(OpCodes.Call, getTypeFromHandle);
gen.EmitCall(OpCodes.Call, getStoredObject);
gen.Emit(OpCodes.Ret);
Переходное поведение стека этого кода:
Вставьте RuntimeTypeHandle
, соответствующий указанной ссылке Type
, в стек с помощью Opcodes.Ldtoken
.
Invoke getTypeFromHandle
, который выталкивает дескриптор типа из стека и помещает фактический System.Type
в стек.
Позвоните вашемустатический метод, который извлекает аргумент Type
из стека и помещает возвращаемое значение вашего собственного метода в стек.
Возврат из метода.