如何使用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
设置元数据,因为它实际上提供了DefineLabel和DeclareLocal,那么为什么它不提供SetMaxStack(short/int)
方法或类似的东西?
如果我无法设置此元数据,Reflecion.Emit
如何确定堆栈的大小?它是否将其设置为最大可能值?或者堆栈可能会在运行时自动扩展?
答案 0 :(得分:2)
ILGenerator
类将跟踪stacksize。看看reference source。例如,涉及UpdateStackSize函数。
答案 1 :(得分:0)
如果您担心的是,即使您的方法非常简单,也没有正确设置max-stack,请继续阅读下面的内容。
首先,元数据中可能不明显的是,CLI中有两种形式的方法标题:Tiny和Fat标题。
根据ECMA-335(II.25.4.1方法标题类型值),方法标题有两种形式:CorILMethod_TinyFormat
(0x02
)和CorILMethod_FatFormat
({{ 1}}。)
方法的微小格式不允许指定max stack。因为它始终必须等于或低于八(0x03
。)
您无法设置它的原因是由于thehennyy提到的:IL Builder会跟踪您的堆栈限制。
还有一些其他限制超出了你的问题,但是如果你很好奇,你可以看看ECMA-335,它为你拼出全部(非常详细的,可能是NSFW: )