2010-05-15 7 views
0

Ce code gif une exception: exception d'invocation, s'il vous plaît aider, je ne sais pas ce qui se passe, je pense est quelque chose avec l'Add parce qu'il travaille quand je pousse sur les piles intergers, et je pousse lvalue Ça n'a pas fonctionné, merciProblèmes avec la génération de code dynamique

static void Main(string[] args) 
    { 
     AppDomain dominioAplicacion = System.Threading.Thread.GetDomain(); 
     AssemblyName nombre_Del_Ensamblado = new AssemblyName("ASS"); 
     AssemblyBuilder ensambladoBld = dominioAplicacion.DefineDynamicAssembly(nombre_Del_Ensamblado, AssemblyBuilderAccess.RunAndSave); 
     ModuleBuilder moduloBld = ensambladoBld.DefineDynamicModule("<MOD"); 
     TypeBuilder claseContenedoraBld = moduloBld.DefineType("claseContenedora"); 
     MethodBuilder mainBld = claseContenedoraBld.DefineMethod("main", MethodAttributes.Public | MethodAttributes.Static, typeof(void), Type.EmptyTypes); 
     ILGenerator il = mainBld.GetILGenerator(); 

     FieldBuilder campoBld = claseContenedoraBld.DefineField("x", typeof(int), FieldAttributes.Public | FieldAttributes.Static); 
     il.Emit(OpCodes.Ldc_I4, 2); 
     il.Emit(OpCodes.Stsfld, campoBld); 

     FieldBuilder campoBld1 = claseContenedoraBld.DefineField("x1", typeof(int), FieldAttributes.Public | FieldAttributes.Static); 

     il.Emit(OpCodes.Ldc_I4, 2); 
     il.Emit(OpCodes.Stsfld, campoBld1); 

     il.Emit(OpCodes.Ldftn, campoBld); 
     //il.Emit(OpCodes.Unbox, typeof(int)); 
     //il.Emit(OpCodes.Stloc_0); 
     il.Emit(OpCodes.Ldloc_0); 


     il.Emit(OpCodes.Ldftn, campoBld1); 
     //il.Emit(OpCodes.Unbox, typeof(int)); 
     il.Emit(OpCodes.Stloc_1); 
     il.Emit(OpCodes.Ldloc_1); 
     //il.Emit(OpCodes.Box, typeof(int)); 
     //il.Emit(OpCodes.Ldftn, campoBld1); 
     //il.Emit(OpCodes.Unbox, typeof(int)); 

     il.Emit(OpCodes.Add); 
     il.Emit(OpCodes.Pop); 
     //il.Emit(OpCodes.Stsfld, campoBld1); 




     il.Emit(OpCodes.Ret); 


     Type t = claseContenedoraBld.CreateType(); 

     object ptInstance = Activator.CreateInstance(t, new Type[] { }); 

     t.InvokeMember("main", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, 
      null, 
      ptInstance, 
      new object[0]); 

     var x = t.GetField("x"); 

    } 
+1

Veuillez poster le texte de l'exception. – Oded

+0

Quel devrait être le code IL complet? Est-ce que le code IL fonctionnerait s'il était dans un assemblage? Je commencerais à chercher une erreur là – Axarydax

Répondre

3

Votre IL est simplement invalide. L'exception n'est pas géniale mais vous bricolez dans les entrailles du compilateur JIT. Opcodes.Ldsftn ne pas faire ce que vous pensez qu'il fait, vous aurez besoin de Ldsfld pour charger un champ. Je ne peux pas vraiment comprendre quel code vous essayez d'écrire, mais cela devrait être proche. Il ne tombe pas en panne de toute façon:

 FieldBuilder campoBld = claseContenedoraBld.DefineField("x", typeof(int), FieldAttributes.Public | FieldAttributes.Static); 
     il.Emit(OpCodes.Ldc_I4, 2); 
     il.Emit(OpCodes.Stsfld, campoBld); 
     FieldBuilder campoBld1 = claseContenedoraBld.DefineField("x1", typeof(int), FieldAttributes.Public | FieldAttributes.Static); 
     il.Emit(OpCodes.Ldc_I4, 2); 
     il.Emit(OpCodes.Stsfld, campoBld1); 
     il.Emit(OpCodes.Ldsfld, campoBld); 
     il.Emit(OpCodes.Ldsfld, campoBld1); 
     il.Emit(OpCodes.Add); 
     il.Emit(OpCodes.Pop); 
     il.Emit(OpCodes.Ret); 

La meilleure façon de savoir ce que IL à utiliser est d'écrire votre code en C#, puis démonter avec Ildasm.exe pour voir ce que l'IL ressemble.

+0

merci votre aide a été très utile, j'ai corrigé mon erreur – cary

+2

@cary, sonne comme une solution. S'il vous plaît, fermez votre discussion en marquant la réponse. –

Questions connexes