cecil:Instruction.Operand类型对应于Instruction.OpCode.Code值

是否有任何文档或是否有一部分我可以参考的cecil源代码,以全面了解cecil将用于给定Code值的Operand类型? 例如:我可以从MethodBodyRocks收集Ldloc采用VariableDefinition类型的Operand ,但是我无法追踪其他一些指令代码。

您可以查看OpCodes.cs文件中每个OpCode的定义。

例如,对于Ldloc,您会看到OperandType.InlineVar

为了添加到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