2010-05-15 1 views
0

이 코드는 예외입니다. 호출 예외가 발생하면 어떻게되는지 알 수 없습니다. 스택 인터 거를 밀어 넣을 때 작동하기 때문에 추가로 생각하는 것이 있습니다. 내가 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

귀하의 일리노이 단순히 유효하지 않습니다. 예외는 크지 않지만 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 사용할지 파악하는 것은 다음 IL의 모습을 볼 수 Ildasm.exe를 함께 분해 먼저 C#에서 코드를 작성하는 것입니다.

+0

당신의 도움이 매우 유용했기 때문에 제 실수를 고쳤습니다 – cary

+2

@cary, 해결책 같았습니다. 답을 표시하여 스레드를 닫으십시오. –