Структура таблицы netnet clr

В настоящее время я читаю книгу под названием Pro.NET Performance. В одной из своих глав содержится подробная информация о внутренней структуре ссылочных типов. Таблица методов - это одно из внутренних полей структуры макета ссылочного типа. В этой книге говорится, что таблица методов состоит из информации о всех методах класса. Я пытаюсь проверить эту теорию с помощью небольшой программы

class MyClass
{
    public void M()
    {
    }
}

static void Main(string[] args)
{
     MyClass m = new MyClass();
     m.M();
     Console.ReadLine();
}  

Я запускаю эту программу с помощью WinDbg Мой сеанс WinDbg выглядит следующим образом

!clrstack -a
ConsoleApp.Program.Main(System.String[]) [c:\visual studio 2012\Projects\Algorithms\ConsoleApp\Program.cs @ 36]
    PARAMETERS:
        args (0x00bff274) = 0x02ba2fbc
    LOCALS:
        0x00bff270 = 0x02ba2fd8

0x02ba2fd8 - адрес экземпляра MyClass Далее я пытаюсь сбрасывать экземпляр MyClass

!do 0x02ba2fd8

Name:        ConsoleApp.MyClass
MethodTable: 00f84d74
EEClass:     00f81840
Size:        12(0xc) bytes
File:        C:\visual studio 2012\Projects\Algorithms\ConsoleApp\bin\Debug\ConsoleApp.exe
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
601a4544  4000001        4         System.Int32  1 instance       10 Z

Следующий шаг - таблица методов дампа (его адрес - 00f84d74)

!dumpmt -md 00f84d74

EEClass:         00f81840
Module:          00f83fbc
Name:            ConsoleApp.MyClass
mdToken:         02000002
File:            C:\visual studio 2012\Projects\Algorithms\ConsoleApp\bin\Debug\ConsoleApp.exe
BaseSize:        0xc
ComponentSize:   0x0
Slots in VTable: 6
Number of IFaces in IFaceMap: 0
--------------------------------------
MethodDesc Table
   Entry MethodDe    JIT Name
6005a2c8 5fcf8354 PreJIT System.Object.ToString()
60065600 5fcf835c PreJIT System.Object.Equals(System.Object)
600319b0 5fcf837c PreJIT System.Object.GetHashCode()
600316e8 5fcf8390 PreJIT System.Object.Finalize()
012604c0 00f84d6c    JIT ConsoleApp.MyClass..ctor()
012604f8 00f84d60    JIT ConsoleApp.MyClass.M()

Выход из команды! dumpmt показывает, что таблица методов содержит запись для метода M(). Но когда я пытаюсь сбрасывать память по адресу 00f84d74

dd  00f84d74

00f84d74  00000200 0000000c 00024188 00000004
00f84d84  601a299c 00f83fbc 00f84db0 00f81840
00f84d94  012604c0 00000000 00f84da0 6005a2c8
00f84da4  60065600 600319b0 600316e8 00000080
00f84db4  00000000 03ba3500 00000000 03ba3504
00f84dc4  00000000 00000000 00000000 00000000
00f84dd4  00000000 00000000 00000000 00000000
00f84de4  00000000 00000000 00000000 00000000

Я не могу найти ссылки на адрес метода M() (012604f8)

Итак, вопрос в том, содержит ли таблица методов ссылки на не виртуальные методы? Где они хранятся?

Ответ 1

введите описание изображения здесь

Спасибо одному из моих коллег, которые пролили некоторый свет на мой вопрос. Оказывается, указатели метода расположены в отрицательных смещениях относительно указателя таблицы методов