在分解处理对象和实例调用的.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查找?