2015-11-11 7 views
2

Как установить .maxstack директива с ILGenerator?Как установить «.maxstack» с ILGenerator

Например, типичный метод сеттер имеет .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, поскольку она фактически предлагает DefineLabel и DeclareLocal, так почему бы не так предложить метод SetMaxStack(short/int) или что-то подобное?

Если я не могу установить эти метаданные, как Reflecion.Emit определяет размер стека? Устанавливает ли он максимальное возможное значение? Или, может быть, стек автоматически расширяется во время выполнения?

+1

Это не значит, что вы делаете это правильно. DeclareLocal() всегда получает это правильно. –

ответ

0

Если вы обеспокоены тем, что он не устанавливает правильную настройку max-stack, даже если ваш метод очень прост, продолжайте читать ниже.

Вначале метаданные могут быть очевидны, есть две формы заголовков методов в CLI: крошечные и жирные заголовки.

Заголовок метода, в соответствии с ECMA-335 (значения типа заголовка II.25.4.1 метода) поставляется в двух формах: (. 0x03) CorILMethod_TinyFormat (0x02) и CorILMethod_FatFormat

Миниатюрный формат для методов делает не позволяют специфицировать максимальный стек. Поскольку это всегда должно быть на уровне или ниже восьми (8.)

Причина, по которой вы не можете установить ее, объясняется тем, что упомянутый thehennyy: IL Builder отслеживает лимиты стека для вас.

Там же несколько других ограничений, которые выходят за рамки вашего вопроса, но если вам интересно, вы можете взглянуть на ECMA-335, который разъясняющий все из ее для вас (в очень явном подробно, может быть NSFW :)

 Смежные вопросы

  • Нет связанных вопросов^_^