2015-10-07 109 views
1

在Mono.Cecil能做到,使用Ldarg_S創建指令時,直接的方法:如何在Mono.Cecil中創建Ldarg_S指令?

Instruction.Create(OpCodes.Ldarg_S, 4); 

不起作用,因爲Mono.Cecil expects操作數類型爲OperandType.InlineI,而OpCodes.Ldarg_S操作數的類型是ShortInlineArg。相反,我需要使用Create (OpCode opcode, ParameterDefinition parameter) : Instruction重載。

這需要初始化ParameterDefinition,反過來,需要下列參數:

  • string name
  • ParameterAttributes attributes
  • TypeReference parameterType

什麼是那些東西?我如何指定我只需要第四個(或第五個或第六個)參數?

回答

1

在對Mono.Cecil的源代碼進行深入檢查之後,似乎沒有辦法產生像ldarg.s 4那樣簡單的指令。

相反,Mono.Cecil所做的是需要您指定ParameterDefinition,然後將其與方法的參數列表進行匹配以查找實際的索引。

最簡單的方法是使用MethodDefinition.Parameters屬性按索引檢索相應的索引並將其傳遞給Instruction.Create。可能的是,這種方法的目標是讓調用者通過指定給定的參數來管理參數並讓Mono.Cecil確定實際的索引更安全。調用者確定實際索引的確有點棘手,特別是在ldarg.0參考this的實例方法的情況下,而不是實際的第一個參數。