2010-05-15 92 views
0

問題該代碼GIF異常:調用異常,請大家幫幫忙,我不知道發生什麼事,我覺得是有些事情與添加,因爲他當我壓入棧intergers工作,當我推左值它沒有工作,謝謝與生成動態代碼

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 2010-05-15 18:12:52

+0

應該是什麼完整的IL代碼? IL代碼是否可以在程序集中工作?我就開始尋找了錯誤,所以 – Axarydax 2010-05-15 18:12:52

回答

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 2010-05-16 19:27:02

+2

@cary,聽起來像一個解決方案。請通過標記回答來關閉你的線程。 – 2010-05-16 21:20:12