用Mono.Cecil提取方法调用参数

问题描述:

我想提取所有传递给具有Mono.Cecil的特定方法的参数。
在正在构建的项目后运行的后处理脚本中,我能够找到所有方法调用,甚至可以提取传递给该函数的参数的类型。然而,我无法得到实际的价值......所以这对于Mono.Cecil来说甚至是可能的,如果是的话,我需要看什么价值?用Mono.Cecil提取方法调用参数

这里是我当前的代码:

List<MethodDefinition> methods = new List<MethodDefinition>(); 
foreach (ModuleDefinition _module in assembly.Modules) { 
    foreach (TypeDefinition _type in _module.Types) { 
     methods.AddRange (_type.Methods); 
    } 
} 
var uiExtensionMethod = methods 
     .Where(m => m.DeclaringType.Name == "SetCustomText").FirstOrDefault(); 
var instructions = uiExtensionMethod.Body.Instructions; 
var count = instructions.Count; 
var instructionArray = instructions.ToArray(); 
for (int i = 0; i < count; i++) { 
    if (instructionArray [i] != null) { 
     if (instructionArray [i].Operand != null) { 
      var paramType = instructionArray [i].Operand.ToString(); 
      // So here I have the type of the parameter, but I cannot get the value... 
     } 
    } 
} 
+0

你是什么意思的价值? 'Console.WriteLine(“Hello”)','“Hello”'会是值吗?但经常计算...'string temp =“HELLO”.ToLower(); Console.WriteLine(temp)'...在最简单的情况下,你正试图解决一个几乎不可能的问题。 – xanatos

+0

随着Mono.Cecil你正在看一个DLL,而不是正在运行的程序......这就像试图通过解剖它的尸体来理解一个人的想法...... – xanatos

+0

我完全意识到这一点。我只需要直接调用该方法,就像您的“Hello”示例一样。我知道我在看一个dll来... – Tom

好了,所以我找到了解决这个。

问题是,Mono.Cecil确实找到了我的方法调用,但它在文件内部处理了它们,其中参数已写入变量,因此无法转换为字符串。

所以我的解决方案是,解析所有方法有一个字符串作为一个操作数,然后检测他们的下一步操作。如果下一个操作是我的选择功能,那么我找到了我正在寻找的字符串:)