2010-05-15 2 views
0

Этот код gif исключение: исключение вызова, пожалуйста, помогите, я не знаю, что произойдет, я думаю, что это что-то с добавлением, потому что он работает, когда я нажимаю на стеки, и когда i push lvalue Это не работает, спасибоПроблемы с генерацией динамического кода

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

Пожалуйста, разместите текст исключения. – Oded

+0

Какой должен быть полный код IL? Будет ли этот IL-код работать, если бы он был в сборке? Я бы начал искать ошибку там – Axarydax

ответ

3

Ваш IL просто недействителен. Исключение не очень велико, но вы возитесь в недрах JIT-компилятора. Opcodes.Ldsftn делает не делать то, что, по вашему мнению, он делает, вам понадобится Ldsfld для загрузки поля. Я не могу понять, какой код вы пытаетесь написать, но это должно быть близко. Это не врезаться в любом случае:

 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); 

Лучший способ выяснить, что IL использовать, чтобы написать свой код в C#, а затем разобрать его с Ildasm.exe, чтобы увидеть, что IL выглядит.

+0

спасибо, что ваша помощь была очень полезна, я исправил свою ошибку – cary

+2

@cary, звучит как решение. Пожалуйста, закройте свою нить, отметив ее ответ. –