如何使用ILGenerator设置“.maxstack”

时间:2015-11-11 17:34:31

标签: c# .net reflection cil reflection.emit

如何使用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如何确定堆栈的大小?它是否将其设置为最大可能值?或者堆栈可能会在运行时自动扩展?

2 个答案:

答案 0 :(得分:2)

ILGenerator类将跟踪stacksize。看看reference source。例如,涉及UpdateStackSize函数。

答案 1 :(得分:0)

如果您担心的是,即使您的方法非常简单,也没有正确设置max-stack,请继续阅读下面的内容。

首先,元数据中可能不明显的是,CLI中有两种形式的方法标题:Tiny和Fat标题。

根据ECMA-335(II.25.4.1方法标题类型值),方法标题有两种形式:CorILMethod_TinyFormat0x02)和CorILMethod_FatFormat({{ 1}}。)

方法的微小格式不允许指定max stack。因为它始终必须等于或低于八(0x03。)

您无法设置它的原因是由于thehennyy提到的:IL Builder会跟踪您的堆栈限制。

还有一些其他限制超出了你的问题,但是如果你很好奇,你可以看看ECMA-335,它为你拼出全部(非常详细的,可能是NSFW: )