1
Я пытаюсь создать вызов метода прокси в сгенерированном классе с кодами операций, и я получаю ExecutionEngineException
. Этот метод должен получать возвращаемый тип как первый аргумент и массив аргументов из метода вызова.Исправить код работает плохо
var methodILGen = methodBuilder.GetILGenerator();
if (methodInfo.ReturnType != typeof(void))
{
var method = typeBuilder.BaseType.GetMethod("proxyCaller");
var args = methodInfo.GetParameters();
var lb = methodILGen.DeclareLocal(methodInfo.ReturnType);
LocalBuilder _args = methodILGen.DeclareLocal(typeof(object[]));
methodILGen.Emit(OpCodes.Ldc_I4_S, args.Length);
methodILGen.Emit(OpCodes.Newarr, typeof(object));
methodILGen.Emit(OpCodes.Stloc, _args);
methodILGen.Emit(OpCodes.Ldloc, _args);
for (int i = 0; i < args.Length; i++)
{
methodILGen.Emit(OpCodes.Ldc_I4_S, i);
methodILGen.Emit(OpCodes.Ldarg_S, i + 1);
methodILGen.Emit(OpCodes.Stelem_Ref);
methodILGen.Emit(OpCodes.Ldloc, _args);
}
methodILGen.Emit(OpCodes.Stloc, _args);
methodILGen.Emit(OpCodes.Ldarg_0); // instance pointer
methodILGen.Emit(OpCodes.Ldtoken, lb.LocalType); //return type
methodILGen.Emit(OpCodes.Ldloc, _args); //args list
methodILGen.Emit(OpCodes.Call, method);//, new Type[0]);
if (methodInfo.ReturnType.IsValueType || methodInfo.ReturnType.IsEnum) methodILGen.Emit(OpCodes.Unbox_Any, lb.LocalType);
}
methodILGen.Emit(OpCodes.Ret);
typeBuilder.DefineMethodOverride(methodBuilder, methodInfo);
И вторая проблема заключается в том, что я получаю сначала массив аргументов, а затем возвращаю тип.
Это плохое название. Пожалуйста, прочитайте http://meta.stackexchange.com/questions/10647/how-do-i-write-a-good-title –
Вы пытались сохранить сборку и запустить PEVerify? – svick