gpt4 book ai didi

c# - Mono Cecil - 初始化局部变量

转载 作者:行者123 更新时间:2023-12-05 01:48:42 27 4
gpt4 key购买 nike

我有以下方法:

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都是一样的,就好像我直接编译了完整的代码一样。知道我做错了什么吗?

最佳答案

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

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

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

然后你需要调用processor.Create(xxx,indexto local variable);

这应该可以解决问题。我唯一没有看到的是如何从 Type 中获取 TypeDefinition。我认为您需要先将程序集加载到 Mono Cecil 中,然后才能使用这种方法。

关于c# - Mono Cecil - 初始化局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7220683/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com