首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用.maxstack设置“ILGenerator”

如何用.maxstack设置“ILGenerator”
EN

Stack Overflow用户
提问于 2015-11-11 17:34:30
回答 2查看 551关注 0票数 2

如何使用.maxstack指令ILGenerator(https://msdn.microsoft.com/en-us/library/system.reflection.emit.ilgenerator(v=vs.110%29.aspx)? )

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

代码语言:javascript
复制
.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如何确定堆栈的大小?它是否将其设置为最大可能值?或者堆栈在运行时会自动展开?

EN

回答 2

Stack Overflow用户

发布于 2015-11-11 17:40:09

ILGenerator类将跟踪堆栈大小。看一看参考源。例如,涉及到UpdateStackSize函数。

票数 2
EN

Stack Overflow用户

发布于 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 :)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33656409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档