2015-11-11 35 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 :)