Дизассемблированные функции .NET, часть 2

При дизассемблировании кода .NET, связанного с объектами и вызовами экземпляров, я обнаружил, что есть несколько вещей, которые я не совсем понимаю:

Вот мой тестовый код:

class Foo
{
   public void Bar()
   {
       Console.WriteLine("hello");
   }
}

...

var foo = new Foo();
foo.Bar();

А вот и разобранный результат (оптимизированный)

15:             var foo = new Foo();
00000019  mov         ecx,403880h           //ecx = address of Foo type ?
0000001e  call        FFF71FB0              //call ctor ?
00000023  mov         esi,eax               //esi = result ?

16:             foo.Bar();
00000025  call        63377060  //this seems to be console.writeline inlined (from bar)
0000002a  mov         ecx,eax 
0000002c  mov         edx,dword ptr ds:[03612034h] 
00000032  mov         eax,dword ptr [ecx] 
00000034  mov         eax,dword ptr [eax+3Ch] 
00000037  call        dword ptr [eax+10h] // esi.Bar() ?

Я предполагаю, что первая часть касается загрузки типа Foo и последующего вызова на нем конструктора?

А как же остальное?

Еще одна странность заключается в том, что код генерирует следующий IL:

L_0017: callvirt instance void CSApp.Foo::Bar()

Почему он выполняет callvirt не виртуальным методом? Это то, что происходит в машинном коде? поиск по vtable?


person Roger Johansson    schedule 12.02.2011    source источник
comment
Ознакомьтесь с ответами здесь: stackoverflow.com/questions/193939/call-and-callvirt   -  person SK-logic    schedule 12.02.2011
comment
Если вы прочтете сообщение еще раз, то увидите, что вызываемая функция НЕ является виртуальной, но по-прежнему генерирует инструкцию callvirt.   -  person Roger Johansson    schedule 12.02.2011
comment
Прочтите комментарий Дейла ниже ответа на вопрос, связанный с SK-logic.   -  person Lukáš Novotný    schedule 12.02.2011
comment
ознакомьтесь с этим вопросом по поводу callvirt   -  person Thomas Levesque    schedule 12.02.2011