2013-03-07 16 views
7

Tôi đang khởi tạo một biến số nguyên như thế này:Phát ra biến địa phương và gán giá trị cho nó

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

Làm thế nào tôi có thể truy cập vào nó và gán giá trị cho nó? Tôi muốn làm một cái gì đó như thế này:

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

Đó là biến LocalBuilder, không phải biến số nguyên. – MrFox

Trả lời

23

Sử dụng LdlocStloc opcodes để đọc và ghi các biến cục bộ:

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. 

Lưu ý rằng các biên dịch C# sử dụng dưới hình thức viết tắt của một số các opcodes (qua .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 Đây là câu trả lời rất hay. Tôi ước tôi có thể bỏ phiếu cho nó một số chi tiết. Thực hiện tốt. – Yuck

+0

Cảm ơn bạn rất nhiều vì đã giúp bạn! Ví dụ của bạn là một trợ giúp tuyệt vời! – Seishin

Các vấn đề liên quan