2011-06-27 9 views
7

I intentó generar IL para el método recursivo usando siguiente estrategia, En primer lugar he definido tipo usando siguiente fragmento de códigoGeneración de IL para métodos recursivos

private void InitializeAssembly(string outputFileName) 
     { 
      AppDomain appDomain = AppDomain.CurrentDomain; 
      AssemblyName assemblyName = new AssemblyName(outputFileName); 
      assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName, 
                   AssemblyBuilderAccess.Save); 
      moduleBuilder = assemblyBuilder.DefineDynamicModule(outputFileName, outputFileName + ".exe"); 
      typeBuilder = moduleBuilder.DefineType(typeName, TypeAttributes.Public); 
      methodBuilder = typeBuilder.DefineMethod("Main", 
            MethodAttributes.Static | MethodAttributes.Public, 
            typeof(void), 
            System.Type.EmptyTypes); 
      ilGen = methodBuilder.GetILGenerator(); 

     } 

Siguiente I comenzó a generar IL para el método recursivo como se indica a continuación.

Para las llamadas a método en sí dentro del cuerpo método que utiliza siguiente constructo,

ilOfMethod.Emit(OpCodes.Call, typeBuilder.GetMethod("MethodName", new System.Type[] {typeof(arg1),typeof(arg2),etc})); 

Finalmente salvo generada conjunto usando método siguiente.

private void SaveAssembly(string outputFileName) 
     { 
      ilGen.Emit(OpCodes.Ret); 
      typeBuilder.CreateType(); 
      moduleBuilder.CreateGlobalFunctions(); 
      assemblyBuilder.SetEntryPoint(methodBuilder); 
      assemblyBuilder.Save(outputFileName + ".exe"); 
     } 

Desafortunadamente esto no está funcionando desde el constructo llamado método recursivo, dentro del método devuelve un valor nulo. El problema aquí es que la llamada recursiva dentro del método (es decir, ilOfMethod.Emit(OpCodes.Call, typeBuilder.GetMethod("MethodName", new System.Type[] {typeof(arg1),typeof(arg2),etc})); ) devuelve nulo. Dado que realmente creamos el tipo dentro del método SaveAssembly(), esto es aceptable. Entonces, mi pregunta es: ¿es posible generar IL para métodos recursivos utilizando el constructo anterior? Si no es posible, hágamelo saber que construcciones alternativas para generar IL para métodos recursivos.

Respuesta

7

Yo no lo he probado, pero si no recuerdo mal que debería ser capaz de utilizar simplemente el resultado de DefineMethod para emitir la instrucción Call:

MethodBuilder method = typeBuilder.DefineMethod("MethodName", ...); 
... 

ILGenerator ilOfMethod = method.GetILGenerator(); 

... 
ilOfMethod.Emit(OpCodes.Call, method); 
+0

A punto de publicar misma. ['MethodBuilder'] (http://msdn.microsoft.com/en-us/library/system.reflection.emit.methodbuilder.aspx) hereda de' MethodInfo', por lo que parece válido allí. –

+0

+1 ¡Muchas gracias! Tu sugerencia funciona y pude generar IL para métodos recursivos –

Cuestiones relacionadas