2010-03-25 16 views
5

He visto un poco la representación de una matriz en la memoria con Windbg y el plugin SOS.¿Cuál es el encabezado de una matriz en .NET

Aquí es el C#:

class myobj{ 
    public int[] arr; 
} 
class Program{ 
    static void Main(string[] args){ 
    myobj o = new myobj(); 
    o.arr = new int[7]; 
    o.arr[0] = 0xFFFFFF; 
    o.arr[1] = 0xFFFFFF; 
    o.arr[2] = 0xFFFFFF; 
    o.arr[3] = 0xFFFFFF; 
    o.arr[4] = 0xFFFFFF; 
    } 
} 

I descanso en final del Main, y yo Observ:

0:000> !clrstack -l 
OS Thread Id: 0xc3c (0) 
ESP  EIP  
0015f0cc 0043d1cf test.Program.Main(System.String[]) 
    LOCALS: 
     0x0015f0d8 = 0x018a2f58 
0:000> !do 0x018a2f58 
Name: test.myobj 
MethodTable: 0026309c 
EEClass: 00261380 
Size: 12(0xc) bytes 
(C:\Users\admin\Documents\Visual Studio 2008\Projects\test\test\bin\Debug\test.exe) 
Fields: 
     MT Field Offset     Type VT  Attr Value Name 
01324530 4000001  4  System.Int32[] 0 instance 018a2f64 tab 
0:000> dd 018a2f64 
018a2f64 01324530 00000007 00ffffff 00ffffff 
018a2f74 00ffffff 00ffffff 00ffffff 00000000 
018a2f84 00000000 00000000 00000000 00000000 

I puede ver que la cabecera contiene el tamaño de la matriz (00000007) pero mi pregunta es: ¿cuál es el valor 01324530?

Gracias!

Respuesta

5

El valor 01324530 es la tabla de métodos. Así es como .NET implementa métodos virtuales: cada método es un puntero a una función.

Tenga en cuenta que el valor de la matriz está en el puntero 018a2f64. Veo que dejaste la memoria con dd. En caso de que no lo sepas, también puedes volcar la matriz con el comando! Da:

!da 018a2f64 
+0

¿Qué hace un puntero a un método en una matriz? – Thomas

+0

Las matrices tienen métodos al igual que otros objetos. – SLaks

+0

Las matrices en .NET son clases, todas derivadas de 'System.Array'. Como hay una derivación, existe una tabla de métodos virtuales involucrada para los métodos sobrecargados. – Blindy

0

Here es un excelente artículo que describe matrices en .Net 1.0.

No sé cuánto ha cambiado desde entonces.

0

¿Qué significa MT en esta línea?

 MT Field Offset     Type VT  Attr Value Name 
01324530 4000001  4  System.Int32[] 0 instance 018a2f64 tab 

Supongo que significa lo mismo, ya que es el mismo número.

(basado en el comentario de Andrey que significa tabla de métodos.)

Cuestiones relacionadas