Web Log di Adrian Florea

"You know you've achieved perfection in design, not when you have nothing more to add, but when you have nothing more to take away." Antoine de Saint-Exupery
posts - 440, comments - 2715, trackbacks - 3944

My Links

Archives

Post Categories

Image Galleries

.RO Blogs

.RO People

.RO Sites

Blogs

Furls

Links

vinCitori

GetILAsByteArray e l'opzione /bytes dell'ildasm

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.

Print | posted on martedì 20 settembre 2005 18:02 | Filed Under [ Carillon .NET ]

Powered by:
Powered By Subtext Powered By ASP.NET