2013-06-14 6 views
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); 

И вторая проблема заключается в том, что я получаю сначала массив аргументов, а затем возвращаю тип.

+2

Это плохое название. Пожалуйста, прочитайте http://meta.stackexchange.com/questions/10647/how-do-i-write-a-good-title –

+1

Вы пытались сохранить сборку и запустить PEVerify? – svick

ответ

4
  1. Сохраните динамическую сборку и используйте файл PEVerify.exe, чтобы проверить его.
  2. OpCodes.ldtoken не кладет тип на стек. Он помещает RuntimeTypeHandle. Для того, чтобы получить тип вы должны сделать что-то вроде этого:

    var getTypeMethod = typeof (Type).GetMethod("GetTypeFromHandle"); 
    methodILGen.Emit(OpCodes.Ldtoken, lb.LocalType); 
    methodILGen.Emit(OpCodes.Call, getTypeMethod); 
    methodILGen.Emit(OpCodes.Ldloc, _args); 
    
Смежные вопросы