ILGenerator, принять решение о возвращаемом значении null - PullRequest
1 голос
/ 23 июля 2011
il.Emit(OpCodes.Callvirt, _compactBinaryReader_ReadObject);

эта функция вызывается, и при особых условиях предоставляется возвращаемое значение 'null'.

если это значение равно NULL, я должен принять решение, перейти к метке илине

использование после вызова метода

il.Emit(OpCodes.Dup);
il.Emit(OpCodes.Brfalse_S, DECISION);

дает мне исключение "JIT Compiler обнаружил внутреннее ограничение".когда я вызываю эту функцию, код создается правильно.

пробовал и OpCodes.Brfalse.

что я делаю не так?

1 Ответ

1 голос
/ 30 июля 2011

Найдены причины вышеуказанной проблемы,

одна вещь, которую следует понимать, что когда исключение «CLR: проверка для генерации кода времени выполнения» это означает, что написанный код имеет неправильный формат, и когда он оценивается ассемблером, он не принимает написанный код, проблема обычно заключается в том, что у стеков есть дополнительные значения или меньше.

"JIT-компилятор обнаружил внутреннее ограничение." генерируется, когда во время выполнения ожидалось что-то еще, мы предоставляем что-то еще в значении или когда в стеке есть что-то еще, когда требовалось что-то еще.

Короче говоря, позднее исключение выдается во время выполнения, а другое выдается, если не выполнены предварительные условия.

В любом случае я нашел причину, у меня все еще присутствовали некоторые значения в стеке, которые я не выскакивал, если было выполнено Условие, поэтому POP OpCode добился цели, и, кстати, для меня Dup OpCode никогда не работал, он всегда помещает в стек пустое значение, а не дублирует самое верхнее значение.

...