Per vedere "the actual bytes (in hex) as instruction comments" nel codice IL, abbiamo l'opzione /bytes dell'ildasm. Per esempio, per il metodo Foo::Sum della classe:
class Foo
{
public int Sum(int a, int b)
{
return a + b;
}
}
otteniamo:
IL_0000: /* 00 | */ nop
IL_0001: /* 03 | */ ldarg.1
IL_0002: /* 04 | */ ldarg.2
IL_0003: /* 58 | */ add
IL_0004: /* 0A | */ stloc.0
IL_0005: /* 2B | 00 */ br.s IL_0007
IL_0007: /* 06 | */ ldloc.0
IL_0008: /* 2A | */ ret
dove con rosso sono scritti in esadecimale gli opcode (e i loro parametri! - vedi lo 00 nella colonna a destra) delle istruzioni IL corrispondenti (vedi ECMA-335, Partition III, 1.2.1 "Opcode encodings").
Ottenere questi byte per un metodo o per un costruttore è semplicissimo, basta utilizzare (in .NET 2.0) il metodo GetILAsByteArray: Per esempio, questo snippet:
foreach(byte b in typeof(Foo).GetMethod("Sum").GetMethodBody().GetILAsByteArray())
{
Console.WriteLine(Convert.ToString(b, 16).PadLeft(2, '0').ToUpper());
}
stampa:
00
03
04
58
0A
2B
00
06
2A
cioè, esattamente i byte di sopra, in rosso.