2012-04-03 4 views
5

У меня возникла новая проблема. Мой код:Ошибка «AccessViolationException была необработанной» в управляемом коде C#

.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

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

+2

Просто используйте il.DeclareLocal (...); –

+3

Protip: при написании IL, всегда используйте PEVerify после сборки. Он сразу сказал бы вам эту ошибку. – leppie

+0

Спасибо. Я постараюсь это сделать. – user35443

ответ

7

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

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