Mono Cecil -初始化一个局部变量

本文关键字:一个 局部变量 Cecil 初始化 Mono | 更新日期: 2023-09-27 18:07:04

我有以下方法:

public void DoSomething()
{
  Console.WriteLine("");
}

我想用Mono Cecil修改这段代码。我想在方法中创建一个自定义类的实例:

public void DoSomething()
{
  MyClass instance = new MyClass();
  Console.WriteLine("");
}

目前我使用以下代码:

  var constructorInfo = typeof(MyClass).GetConstructor(new Type[] { });
  MethodReference myClassConstructor = targetAssembly.MainModule.Import(constructorInfo);
  var processor = targetMethod.Body.GetILProcessor();
  var firstInstruction = targetMethod.Body.Instructions[1];
  var instructions = new List<Instruction>() {
      processor.Create(OpCodes.Newobj, myClassConstructor),
      processor.Create(OpCodes.Stloc_0)
  };
  foreach (var instruction in instructions)
  {
      processor.InsertBefore(firstInstruction, instruction);
  }

应用这些更改后,程序无效,无法执行。如果我使用'IL DASM'来查看生成的代码,则缺少以下语句:

.locals init ([0] class [MyAssembly]MyNamespace.MyClass instance)

IL的其余部分是相同的,就好像我直接编译了完整的代码。你知道我做错了什么吗?

Mono Cecil -初始化一个局部变量

我还没有尝试过,但是通过查看Cecil源代码,您应该首先创建局部变量,这是您的MethodBody的一部分。

MethodBody有一个Variables集合,可以通过

填充
body.Variables.Add( new VariableDefinition(typedef) )

则需要调用processor.Create(xxx,indexto local variable);

应该可以了。我唯一没有看到的是如何从Type中得到TypeDefinition。我认为在使用这种方法之前,您需要先将组装加载到Mono Cecil中。