c# - 如何将 IL 翻译成 Emit 语句?

标签 c# reflection.emit

这是 C# 代码:

public class Calc1 : ICalculator
{
    public int Calculate(int x, int y)
    {
        return x + y;
    }
}

这是 IL:

.method public hidebysig newslot virtual final 
    instance int32  Calculate(int32 x,
                              int32 y) cil managed
{
  // Code size       9 (0x9)
  .maxstack  2
  .locals init ([0] int32 CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldarg.1
  IL_0002:  ldarg.2
  IL_0003:  add
  IL_0004:  stloc.0
  IL_0005:  br.s       IL_0007
  IL_0007:  ldloc.0
  IL_0008:  ret
} // end of method Calc1::Calculate

如何将上述 IL 转换为 Emit 语句? 这是我尝试逐行翻译的尝试,但出现“System.InvalidProgramException”。

        string methodName = "Calculate";

        MethodBuilder getFieldMethod = typeBuilder.DefineMethod(methodName, MethodAttributes.Public | MethodAttributes.Virtual, typeof(int), new Type[] { typeof(int), typeof(int) });
        ILGenerator methodIL = getFieldMethod.GetILGenerator();

        Label iL0007Label = methodIL.DefineLabel();

        methodIL.Emit(OpCodes.Nop);
        methodIL.Emit(OpCodes.Ldarg_1);
        methodIL.Emit(OpCodes.Ldarg_2);
        methodIL.Emit(OpCodes.Add);
        methodIL.Emit(OpCodes.Stloc_0);
        methodIL.Emit(OpCodes.Br_S, iL0007Label);

        methodIL.MarkLabel(iL0007Label);
        methodIL.Emit(OpCodes.Ldloc_0);
        methodIL.Emit(OpCodes.Ret);

我的 Emit 语句有什么问题?

最佳答案

你忘了声明局部变量:

ILGenerator methodIL = getFieldMethod.GetILGenerator();

methodIL.DeclareLocal(typeof(int)); // THIS ONE!

Label iL0007Label = methodIL.DefineLabel();

从技术上讲,您忘记了 MethodAttributes.Final,但我不知道您是否要添加它。

请注意,您获得的操作码可能用于调试版本。如果您想查看操作码,我建议使用使用较少操作码的发布版本。

ILGenerator methodIL = getFieldMethod.GetILGenerator();
methodIL.Emit(OpCodes.Ldarg_1);
methodIL.Emit(OpCodes.Ldarg_2);
methodIL.Emit(OpCodes.Add);
methodIL.Emit(OpCodes.Ret);

足以满足您的需求,甚至无需使用局部变量。

关于c# - 如何将 IL 翻译成 Emit 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29529272/

相关文章:

c# - 为什么 Calli 比委托(delegate)调用更快?

c# - 使用 RDLC 的报告无法加载数据集

c# - 如何提交文件而不将其发布到服务器?

c# - C# 中的 SQL 批量复制/插入

.net - 是否可以在没有反射和没有字典的情况下从 F(Type) 转换到 F<T>?

c# - 是否可以对在 C# 中运行时创建的类型使用隐式强制转换?

c# - EF Core 5 - 如何将 EF.Functions.Like 与映射到 JSON 字符串的自定义属性一起使用?

c# - 使用Open CV检测对象缺陷

c# - 什么情况下TypeBuilder.CreateType可以返回null?

.net - 紧凑框架的 Reflection.Emit 替代方案