Ошибка «AccessViolationException была необработанной» в управляемом коде C # - PullRequest
5 голосов
/ 03 апреля 2012

У меня новая проблема.Мой код:

.method public static void  Main() cil managed
{
  .entrypoint
  // Code size       3 (0x3)
  .maxstack  1
  IL_0000:  ldnull
  IL_0001:  stloc.0
  IL_0002:  ret
} // end of method Program::Main

Код C #:

il.Emit(OpCodes.Ldnull);
il.Emit(OpCodes.Stloc_0);
il.Emit(OpCodes.Ret);

Я генерирую этот код с помощью классов System.Reflection и System.Reflection.Emit.Кто-нибудь знает, почему это не работает?Пожалуйста, помогите.

My error

Один маленький вопрос - мне сгенерировать конструктор?

1 Ответ

7 голосов
/ 03 апреля 2012

Вы пытаетесь сохранить ноль в локальном 0 (stloc.0), но на самом деле не определены локальные значения.

Вам необходимо использовать метод DeclareLocal для определения локального, затем вы можете передать его перегрузке Emit, которая принимает LocalBuilder (например, вы можете использовать чтобы выдать код операции stloc, за которым следует ваш LocalBuilder); или вы можете просто продолжать использовать stloc.0, так как знаете, что есть только один местный.

...