2010-11-03 18 views
3

我使用ILGenerator.Emit生成動態類型。我正在生成一個方法體,它將方法參數的類型存儲在一個數組中。爲了實際存儲數組中的元素,我正在遍歷給定方法的參數並構建必要的IL以存儲元素。在第二次迭代中,Break指令出現在Stelem.ref (L_003d以下)指令之後。這經常發生在第二次迭代,我不明白爲什麼。下面是代碼:ILGenerator在將元素存儲在數組中時發出Break指令

 ilGenerator.Emit(OpCodes.Ldc_I4, exampleMethod.GetParameters().Length); 
     ilGenerator.Emit(OpCodes.Newarr, typeof(Type)); 
     ilGenerator.Emit(OpCodes.Stloc, typeArray); 

     for (int idx = 0; idx < exampleMethod.GetParameters().Length; idx++) 
     { 
      ilGenerator.Emit(OpCodes.Ldloc, typeArray); 
      ilGenerator.Emit(OpCodes.Ldc_I4, idx); 
      ilGenerator.Emit(OpCodes.Ldarg, idx + 1); 
      ilGenerator.Emit(OpCodes.Box, typeof(int)); 
      ilGenerator.EmitCall(OpCodes.Callvirt, typeof(object).GetMethod("GetType"), null); 
      ilGenerator.Emit(OpCodes.Stelem_Ref, idx);//second iteration causes a break to be output in the IL 
     } 

     ilGenerator.Emit(OpCodes.Ret); 

和IL輸出是這裏

.method public virtual instance int32 Add3(int32, int32, int32) cil managed 
{ 
.maxstack 3 
.locals init (
    [0] class [mscorlib]System.Type[] typeArray) 
L_0000: ldc.i4 3 
L_0005: newarr [mscorlib]System.Type 
L_000a: stloc.0 
L_000b: ldloc.0 
L_000c: ldc.i4 0 
L_0011: ldarg A_0 
L_0015: nop 
L_0016: nop 
L_0017: box int32 
L_001c: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType() 
L_0021: stelem.ref 
L_0022: nop 
L_0023: nop 
L_0024: nop 
L_0025: nop 
L_0026: ldloc.0 
L_0027: ldc.i4 1 
L_002c: ldarg A_1 
L_0030: nop 
L_0031: nop 
L_0032: box int32 
L_0037: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType() 
L_003c: stelem.ref 
**L_003d: break** 
L_003e: nop 
L_003f: nop 
L_0040: nop 
L_0041: ldloc.0 
L_0042: ldc.i4 2 
L_0047: ldarg A_2 
L_004b: nop 
L_004c: nop 
L_004d: box int32 
L_0052: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType() 
L_0057: stelem.ref 
L_0058: ldarg.0 
L_0059: nop 
L_005a: nop 
L_005b: nop 
L_005c: ret 
} 

任何指針或建議,將不勝感激。

非常感謝

德莫特

回答

5

操作碼的突破爲0x01,順帶還您作爲參數傳遞給stelem.ref發出IDX值。請注意,第三次迭代中有一個額外的ldarg.0(其中idx爲2)。

您不應該爲stelem發射指定參數。

+0

非常感謝您的快速回復和解釋,我永遠不會那麼做。無論如何,你做了什麼建議和它的工作。再次歡呼。 – Dermot 2010-11-03 10:36:21