如何使用.maxstack指令ILGenerator(https://msdn.microsoft.com/en-us/library/system.reflection.emit.ilgenerator(v=vs.110%29.aspx)? )
例如,典型的setter方法有一个.maxstack of 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如何确定堆栈的大小?它是否将其设置为最大可能值?或者堆栈在运行时会自动展开?
发布于 2015-11-11 17:40:09
ILGenerator类将跟踪堆栈大小。看一看参考源。例如,涉及到UpdateStackSize函数。
发布于 2016-06-11 23:33:22
如果您关注的是它没有正确设置最大堆栈,即使您的方法非常简单,请继续阅读下面的内容。
从元数据开始,可能不太明显的是,CLI中有两种形式的方法标头:微头和胖头。
方法头,根据ECMA-335 (II.25.4.1方法标头类型值)以两种形式出现:CorILMethod_TinyFormat (0x02)和CorILMethod_FatFormat (0x03)。
方法的微小格式不允许最大堆栈的规范。因为它总是在8点或以下(8)。
您不能设置它的原因是因为上面提到了:mentioned为您跟踪堆栈限制。
还有一些其他的限制超出了你的问题,但是如果你好奇的话,你可以看看ECMA-335,它为你解释了一切(非常明确的细节,可能是NSFW :)
https://stackoverflow.com/questions/33656409
复制相似问题