2015-11-11 19 views
2

如何设置.maxstack指令与ILGenerator如何使用ILGenerator设置“.maxstack”

例如,一个典型的setter方法具有的.maxstack

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

+1

它不相信你做得对。 DeclareLocal()总是正确的。 –

回答

0

如果您担心的是即使您的方法非常简单,但没有正确设置最大堆栈,请继续阅读以下内容。

从元数据开始可能不明显的是,在CLI中有两种形式的方法头文件:Tiny和Fat头文件。

的方法首部,根据所述ECMA-335(II.25.4.1方法报头类型值)有两种形式:(0x03CorILMethod_TinyFormat0x02)和CorILMethod_FatFormat

用于方法的微小的格式不不允许指定最大堆栈。由于它始终必须等于或低于8(8

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

有超越你的问题了其它一些限制,但如果你好奇,你可以在ECMA-335偷看,这阐明这一切为你(非常明确的细节,可能是NSFW :)