【问题标题】:Emit local variable and assign a value to it发出局部变量并为其赋值
【发布时间】:2013-03-07 18:07:27
【问题描述】:

我正在像这样初始化一个整数变量:

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

如何访问它并为其赋值?我想做这样的事情:

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

【问题讨论】:

  • 这是一个 LocalBuilder 变量,而不是一个整数变量。

标签: c# .net reflection cil reflection.emit


【解决方案1】:

使用LdlocStloc 操作码读写局部变量:

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 

【讨论】:

  • +1 这是一个写得很好的答案。我希望我能多投一些票。做得很好。
  • 非常感谢您的帮助!你的例子很有帮助!
  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
相关资源
最近更新 更多