2017-03-17 134 views
0

我想提取所有傳遞給具有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

回答

0

好了,所以我找到了解決這個。

問題是,Mono.Cecil確實找到了我的方法調用,但它在文件內部處理了它們,其中參數已寫入變量,因此無法轉換爲字符串。

所以我的解決方案是,解析所有方法有一個字符串作爲一個操作數,然後檢測他們的下一步操作。如果下一個操作是我的選擇功能,那麼我找到了我正在尋找的字符串:)