2013-03-07 27 views
7

Sto inizializzazione di una variabile intera come questo:Emit variabile locale e assegnare un valore ad essa

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

Come posso accedervi e assegnare un valore ad esso? Voglio fare qualcosa di simile:

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

Questa è una variabile LocalBuilder, non una variabile intera. – MrFox

risposta

23

Utilizzare i Ldloc e Stloc codici operativi per leggere e scrivere le variabili locali:

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. 

Si noti che il compilatore C# usa la forma abbreviata di alcuni dei codici operativi (tramite .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 Questa è una risposta molto ben scritta. Vorrei poter votare di più. Ben fatto. – Yuck

+0

Grazie mille per l'aiuto! Il tuo esempio è stato di grande aiuto! – Seishin

Problemi correlati