[C#] cecil:Instruction.Operand類型與Instruction.OpCode.Code值相對應


Answers

要添加到poupou的答案, OpCodes.cs顯示哪個OperandType被分配給每個指令代碼。 使用這個OperandType你可以參考CodeReader.ReadOperand來看看如何使用這些OperandType來確定構建哪個具體的對像類型。 另請注意, CodeReader.ReadCode使用CodeReader.ResolveBranches在返回之前將一些操作數從指令偏移量轉換為Instruction對象。

我創建了這個表,這是更方便,然後挖掘每一個來源(任何不包括在這個表中應該有一個InlineNone OperandType):

Instruction.OpCode.Code|Instruction.OpCode.OperandType|Instruction.Operand class
Ldarg_S                |ShortInlineArg                |ParameterDefinition
Ldarga_S               |ShortInlineArg                |ParameterDefinition
Starg_S                |ShortInlineArg                |ParameterDefinition
Ldloc_S                |ShortInlineVar                |VariableDefinition
Ldloca_S               |ShortInlineVar                |VariableDefinition
Stloc_S                |ShortInlineVar                |VariableDefinition
Ldc_I4_S               |ShortInlineI                  |sbyte <===== NOTE: special case
Ldc_I4                 |InlineI                       |int32
Ldc_I8                 |InlineI8                      |int64
Ldc_R4                 |ShortInlineR                  |single
Ldc_R8                 |InlineR                       |float (64 bit)
Jmp                    |InlineMethod                  |MethodReference
Call                   |InlineMethod                  |MethodReference
Calli                  |InlineSig                     |CallSite
Br_S                   |ShortInlineBrTarget           |Instruction
Brfalse_S              |ShortInlineBrTarget           |Instruction
Brtrue_S               |ShortInlineBrTarget           |Instruction
Beq_S                  |ShortInlineBrTarget           |Instruction
Bge_S                  |ShortInlineBrTarget           |Instruction
Bgt_S                  |ShortInlineBrTarget           |Instruction
Ble_S                  |ShortInlineBrTarget           |Instruction
Blt_S                  |ShortInlineBrTarget           |Instruction
Bne_Un_S               |ShortInlineBrTarget           |Instruction
Bge_Un_S               |ShortInlineBrTarget           |Instruction
Bgt_Un_S               |ShortInlineBrTarget           |Instruction
Ble_Un_S               |ShortInlineBrTarget           |Instruction
Blt_Un_S               |ShortInlineBrTarget           |Instruction
Br                     |InlineBrTarget                |Instruction
Brfalse                |InlineBrTarget                |Instruction
Brtrue                 |InlineBrTarget                |Instruction
Beq                    |InlineBrTarget                |Instruction
Bge                    |InlineBrTarget                |Instruction
Bgt                    |InlineBrTarget                |Instruction
Ble                    |InlineBrTarget                |Instruction
Blt                    |InlineBrTarget                |Instruction
Bne_Un                 |InlineBrTarget                |Instruction
Bge_Un                 |InlineBrTarget                |Instruction
Bgt_Un                 |InlineBrTarget                |Instruction
Ble_Un                 |InlineBrTarget                |Instruction
Blt_Un                 |InlineBrTarget                |Instruction
Switch                 |InlineSwitch                  |Instruction array
Callvirt               |InlineMethod                  |MethodReference
Cpobj                  |InlineType                    |TypeReference
Ldobj                  |InlineType                    |TypeReference
Ldstr                  |InlineString                  |string
Newobj                 |InlineMethod                  |MethodReference
Castclass              |InlineType                    |TypeReference
Isinst                 |InlineType                    |TypeReference
Unbox                  |InlineType                    |TypeReference
Ldfld                  |InlineField                   |FieldReference
Ldflda                 |InlineField                   |FieldReference
Stfld                  |InlineField                   |FieldReference
Ldsfld                 |InlineField                   |FieldReference
Ldsflda                |InlineField                   |FieldReference
Stsfld                 |InlineField                   |FieldReference
Stobj                  |InlineType                    |TypeReference
Box                    |InlineType                    |TypeReference
Newarr                 |InlineType                    |TypeReference
Ldelema                |InlineType                    |TypeReference
Ldelem_Any             |InlineType                    |TypeReference
Stelem_Any             |InlineType                    |TypeReference
Unbox_Any              |InlineType                    |TypeReference
Refanyval              |InlineType                    |TypeReference
Mkrefany               |InlineType                    |TypeReference
Ldtoken                |InlineTok                     |IMetadataTokenProvider
Leave                  |InlineBrTarget                |Instruction
Leave_S                |ShortInlineBrTarget           |Instruction
Ldftn                  |InlineMethod                  |MethodReference
Ldvirtftn              |InlineMethod                  |MethodReference
Ldarg                  |InlineArg                     |ParameterDefinition
Ldarga                 |InlineArg                     |ParameterDefinition
Starg                  |InlineArg                     |ParameterDefinition
Ldloc                  |InlineVar                     |VariableDefinition
Ldloca                 |InlineVar                     |VariableDefinition
Stloc                  |InlineVar                     |VariableDefinition
Unaligned              |ShortInlineI                  |byte
Initobj                |InlineType                    |TypeReference
Constrained            |InlineType                    |TypeReference
No                     |ShortInlineI                  |byte
Sizeof                 |InlineType                    |TypeReference
Question

是否有任何文檔或是否有一部分cecil源代碼,我可以參考以全面了解哪些Operand類型cecil將用於給定的Code值? 例如:我可以從MethodBodyRocks中收集到MethodBodyRocks需要一個VariableDefinition類型的Operand ,但是我還沒有能夠跟踪其他一些指令代碼。