我有以下方法:
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的其余部分是相同的,就像我直接编译完整代码一样。 我有什么想法吗?
答案 0 :(得分:3)
我没有尝试过,但是通过查看Cecil源代码,您应首先创建属于MethodBody
的本地变量。
MethodBody
有一个Variables
集合,可以通过
body.Variables.Add( new VariableDefinition(typedef) )
然后你需要拨打processor.Create(xxx,indexto local variable);
这应该可以解决问题。我唯一没看到你如何从TypeDefinition
获得Type
。我认为您需要先将组件加载到Mono Cecil中,然后才能使用此方法。