
!DumpMT -md 00913080
EEClass: 009113b8
Module: 00912c14
Name: ConsoleApplication29.Foo
mdToken: 02000002 (C:\Documents and Settings\Greg\My Documents\Visual Studio 2005\Projects\ConsoleApplication29\ConsoleApplication29\bin\Release\ConsoleApplication29.exe)
BaseSize: 0xc
ComponentSize: 0x0
Number of IFaces in IFaceMap: 0
Slots in VTable: 6
--------------------------------------
MethodDesc Table
Entry MethodDesc JIT Name
79354bec 7913bd48 PreJIT System.Object.ToString()
793539c0 7913bd50 PreJIT System.Object.Equals(System.Object)
793539b0 7913bd68 PreJIT System.Object.GetHashCode()
7934a4c0 7913bd70 PreJIT System.Object.Finalize()
00de00b0 00913070 JIT ConsoleApplication29.Foo.Test()
009130d4 00913078 NONE ConsoleApplication29.Foo..ctor()
可以看到方法现在已经被JIT编译了,并且Method table也被更新,以反映这个变化(00de00b0).这就是JIT编译后的非托管代码入口,通过查看当前执行堆栈能够证实我们的想法
!CLRStack
OS Thread Id: 0x8e8 (2280)
ESP EIP
0012f47c 00de00b0 ConsoleApplication29.Foo.Test()
0012f480 00de0087 ConsoleApplication29.Program.Main(System.String[])
0012f69c 79e88f63 [GCFrame: 0012f69c]
从函数里跳出后,测试代码会又一次执行同样的调用,不过这次,他不会在经过thunk,而是直接进入已经产生好的非托管代码
以上就是代码调用的一般机制,除非代码发生"颠簸"(pitched),被反复调入调出,欲知详情,请听下回分解
源文地址:
http://codebetter.com/blogs/gregyoung/archive/2006/07/20/147512.aspx