【发布时间】:2020-05-14 19:42:17
【问题描述】:
如果我正在编写代码,这将非常简单。我的代码看起来像:
public class SomeClass
{
public void SomeMethod(ISomeService someService)
{
}
private void AnotherMethod(ISomeService someService)
{
}
}
我可以使用 Type 引用获取这两种方法的 Method 定义,但我想要获取的是从 SomeMethod 到在 IL 中添加的 AnotherMethod 的调用,因此您将拥有类似的等效代码:
public void SomeMethod(ISomeService someService)
{
AnotherMethod(someService);
}
此刻我完全迷失了,试图理解如何正确构建必要的指令。
我现在的样子是这样的:
private void ProcessType(TypeDefinition typeDef)
{
var anotherMethodDef = typeDef.Methods.FirstOrDefault(x => HasMethod(x, "AnotherMethod"));
if(someMethodDef != null)
{
var someMethodDef = typeDef.Methods.First(x => HasMethod(x, "SomeMethod"));
var processor = someMethodDef.Body.GetILProcessor();
// Now I need to generate:
// AnotherMethod(someService); as a new instruction
}
}
private static bool HasMethod(MethodDefinition method, string expected) =>
method.Name == expected && method.Parameters.Count() == 1 &&
method.Parameters.First().TypeDefinition.FullName == "Contoso.ISomeService";
【问题讨论】:
-
我总是从尽可能多地用 C# 编写开始,然后在例如ILSpy 使用“IL”选项而不是“C#”。
-
是的,这样做了......仍然不清楚我到底错过了什么。在尝试插入新指令后,我最接近的结果是反编译器异常。这似乎应该很容易做到,但我完全失去了我在这里所缺少的东西。
标签: c# mono.cecil