c# mono cil il mono.cecil

c# - cecil: Instruction.Operand types correspondiente a Instruction.OpCode.Code value



mono mono.cecil (2)

¿Hay alguna documentación o hay una parte del código fuente de Cecil que pueda consultar para obtener una vista completa de qué tipos de Operand usará cecil para un valor de Code dado? Por ejemplo: puedo MethodBodyRocks de MethodBodyRocks que Ldloc toma un Operand de tipo VariableDefinition , pero no he podido encontrarlo en algunos de los demás códigos de instrucción.


Para agregar a la respuesta de poupou , OpCodes.cs muestra qué OperandType se asigna para cada Código de instrucción. Usando este OperandType puede consultar CodeReader.ReadOperand para ver cómo estos OperandType s se usan para determinar qué tipo de objeto concreto se construye. También tenga en cuenta que CodeReader.ReadCode usa CodeReader.ResolveBranches para transformar algunos operandos de offsets de instrucción en objetos Instruction antes de volver.

Creé esta tabla que era mucho más conveniente que buscar en la fuente cada vez (todo lo que no esté cubierto en esta tabla debe tener un 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


Puede ver la definición de cada OpCode en el archivo OpCodes.cs .

Por ejemplo, para Ldloc vería OperandType.InlineVar