2012-04-27 3 views
3

я испуская некоторый IL, вот мой код:программы IL Invalid, не может понять, почему

mgen.Emit(OpCodes.Ldc_I4,0); 
mgen.Emit(OpCodes.Newarr, typeof(object)); 
mgen.Emit(OpCodes.Stloc_1); // THIS SHOULD      


mgen.Emit(OpCodes.Ldloc_1); // MATCH THIS ONE 
mgen.Emit(OpCodes.Callvirt, typeof(IInternalFactory).GetMethod("Create")); 
mgen.Emit(OpCodes.Castclass, method.ReturnType); 
mgen.Emit(OpCodes.Ret); 

Это работа продолжается, Я создать массив, и теперь я готовлюсь чтобы сделать что-то с ним, поэтому я решил сохранить его (Stloc_1), а затем вернуть его обратно в стек (Ldloc_1), как только я выполнил эту инструкцию, IL сигнализируется как недействительный, но если я правильно понял, эта инструкция должна уйти стек немодифицирован. Без этих двух команд IL работает отлично. Поэтому я не могу понять, почему поп с последующим нажатием не работает.

+2

Действительно ли вы создали локальное устройство, которое вы пытаетесь сохранить? – Sven

+0

@ Свен спасибо, это правильный ответ на мой вопрос, если вы хотите отправить сообщение, я соглашусь :) –

+0

Я добавил ответ. – Sven

ответ

5

Прежде чем вы сможете хранить значения в локальном, вы должны объявить локальный, используя метод ILGenerator.DeclareLocal. Если обратиться к местным жителям, которые не существуют, это приведет к тому, что компилятор JIT объявит программу недействительной.

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

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