Простой Pop, а затем загрузить обратно не работает - PullRequest
1 голос
/ 08 августа 2011

После вызова функции, которая возвращает object, я пытаюсь сохранить значение в стеке в локальной переменной, а затем отправить его обратно, но это не удается с исключением

Исключение было выброшено с целью вызова

Код выглядит следующим образом:

.....

MethodInfo checked_static = typeof(NameSpace1.Class1).GetMethod(
    "Check", new Type[1] { typeof(object) });
adderIL.Emit(OpCodes.Callvirt, checked_static);
adderIL.Emit(OpCodes.Stloc_3);
adderIL.Emit(OpCodes.Ldloc_3);
adderIL.Emit(OpCodes.Brfalse, TRUE);

.....

Если я удаляю Stloc_3 и Ldloc_3, все работает нормально, я теряюсь здесь.

1 Ответ

1 голос
/ 10 августа 2011

Судя по вашему ответу на мой вопрос, вы не указали свой местный. Каждый метод в IL указывает типы всех локальных элементов, которые он использует, поэтому вам необходимо объявить его, используя одну из перегрузок DeclareLocal в вашем экземпляре adderIL. Если вы не объявили никаких других местных жителей, то вам также нужно будет использовать OpCodes.Stloc_0 вместо OpCodes.Stloc_3 (и аналогично для нагрузок); в качестве альтернативы вы можете просто использовать OpCodes.Stloc или OpCodes.Stloc_S и передать экземпляр LocalBuilder из вызова DeclareLocal в качестве второго аргумента adderIL.Emit (в этом случае библиотека Reflection.Emit получит правильный индекс из локального для вас).

...