2013-03-07 1 views
7

Я инициализации целую переменную так:Выделяют локальную переменную и присвоить ей значение

LocalBuilder a = ilGen.DeclareLocal(typeof(Int32)); 

Как я могу получить доступ к нему, и присвоить ему значение? Я хочу сделать что-то вроде этого:

int a, b; 
a = 5; 
b = 6; 
return a + b; 
+0

Это переменная LocalBuilder, а не целочисленная переменная. – MrFox

ответ

23

Используйте в Ldloc и Stloc опкоды для чтения и записи локальных переменных:

LocalBuilder a = ilGen.DeclareLocal(typeof(Int32)); 
LocalBuilder b = ilGen.DeclareLocal(typeof(Int32)); 
ilGen.Emit(OpCodes.Ldc_I4, 5); // Store "5" ... 
ilGen.Emit(OpCodes.Stloc, a); // ... in "a". 
ilGen.Emit(OpCodes.Ldc_I4, 6); // Store "6" ... 
ilGen.Emit(OpCodes.Stloc, b); // ... in "b". 
ilGen.Emit(OpCodes.Ldloc, a); // Load "a" ... 
ilGen.Emit(OpCodes.Ldloc, b); // ... and "b". 
ilGen.Emit(OpCodes.Add);  // Sum them ... 
ilGen.Emit(OpCodes.Ret);  // ... and return the result. 

Обратите внимание, что C# компилятор использует сокращенную форму некоторых опкодами (через .NET Reflector):

.locals init (
    [0] int32 a, 
    [1] int32 b) 

ldc.i4.5 
stloc.0 
ldc.i4.6 
stloc.1 
ldloc.0 
ldloc.1 
add 
ret 
+0

+1 Это очень хорошо написанный ответ. Хотел бы я проголосовать за него еще немного. Красиво сделано. – Yuck

+0

Большое вам спасибо за помощь! Ваш пример очень помог! – Seishin

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

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