如何使用ILGenerator设置.maxstack指令?

例如,典型的setter方法的.maxstack为2:

.maxstack 2         // The evaluation stack has a max size of 2

IL_0000: ldarg.0                  // the current instance (this)
IL_0001: ldarg.1                  // new value
IL_0002: stfld Int32 _someField   // stores the new value on _someField
IL_0007: ret                      // Return to caller


可以使用ILGenerator设置元数据,因为它实际上提供了DefineLabelDeclareLocal,那么为什么不提供SetMaxStack(short/int)方法或类似的方法呢?

如果无法设置此元数据,Reflecion.Emit如何确定堆栈的大小?是否将其设置为最大可能值?还是堆栈在运行时自动扩展?

最佳答案

ILGenerator类将跟踪堆栈大小。看看reference source。例如,涉及到UpdateStackSize函数。

10-04 18:46