2013-03-07 11 views
7

mam inicjalizacji zmiennej całkowitej takiego:Emit zmiennej lokalnej i przypisać wartość do niego

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

Jak mogę uzyskać do niego dostęp i przypisać wartość do niego? Chcę zrobić coś takiego:

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

To zmienna LocalBuilder, a nie zmienna całkowita. – MrFox

Odpowiedz

23

użyć Ldloc i Stloc rozkazy do odczytu i zapisu zmiennych lokalnych:

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. 

Należy zauważyć, że kompilator C# używa skróconą formę niektóre rozkazy (przez .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 To jest bardzo dobrze napisana odpowiedź. Chciałbym móc głosować na to jeszcze trochę. Ładnie wykonane. – Yuck

+0

Bardzo dziękuję za pomoc! Twój przykład był bardzo pomocny! – Seishin

Powiązane problemy