关于C#静态函数什么时候被调用的问题
2010-09-30 21:00:31 来源:WEB开发网接着我们看看类型A的静态构造函数什么时候应该是什么时候被调用,继续 demo.exe的执行。
0:000> g
#
# 因为static A()和static B()的C#代码差不多,所以编译出来的汇编代码也是差不多
#
0:000> !u 04e4fed8
Normal JIT generated code
A..cctor()
Begin 04e4fed8, size 65
>>> 04e4fed8 cc int 3
04e4fed9 55 push ebp
04e4feda 8bec mov ebp,esp
04e4fedc 56 push esi
04e4fedd 33f6 xor esi,esi
04e4fedf 56 push esi
04e4fee0 51 push ecx
04e4fee1 52 push edx
04e4fee2 b901000000 mov ecx,1
04e4fee7 6a00 push 0
04e4fee9 e2fc loop 04e4fee7
04e4feeb b8d42b3c00 mov eax,3C2BD4h
04e4fef0 8b00 mov eax,dword ptr [eax]
04e4fef2 85c0 test eax,eax
04e4fef4 0f8407000000 je 04e4ff01
04e4fefa b860ad4579 mov eax,offset mscorwks!JIT_DbgIsJustMyCode (7945ad60)
04e4feff ffd0 call eax
04e4ff01 90 nop
04e4ff02 fc cld
04e4ff03 90 nop
04e4ff04 90 nop
#
# 32D1200是“aaaaaaa”的地址
#
04e4ff05 b800122d03 mov eax,32D1200h
04e4ff0a 8b00 mov eax,dword ptr [eax]
#
# 3C2F54是类型A 的MethodTable地址
#
04e4ff0c b9542f3c00 mov ecx,3C2F54h
04e4ff11 50 push eax
04e4ff12 b880e04479 mov eax,offset mscorwks!JIT_InitClass (7944e080)
04e4ff17 ffd0 call eax
#
# 32D0D3C是类型A 的静态变量保存的地址
#
04e4ff19 b83c0d2d03 mov eax,32D0D3Ch
04e4ff1e 50 push eax
04e4ff1f b850bfa179 mov eax,offset mscorejt!STSFLD_REF_helper (79a1bf50)
04e4ff24 ffd0 call eax
04e4ff26 90 nop
04e4ff27 54 push esp
04e4ff28 55 push ebp
04e4ff29 b814000000 mov eax,14h
04e4ff2e 50 push eax
04e4ff2f b8e091a179 mov eax,offset mscorejt!check_stack (79a191e0)
04e4ff34 ffd0 call eax
04e4ff36 8b75fc mov esi,dword ptr [ebp-4]
04e4ff39 8be5 mov esp,ebp
04e4ff3b 5d pop ebp
04e4ff3c c3 ret
接着我们看看A的静态构造函数又是什么时候被调用的,未完待续……,实在是太长了,后面的分析写续集吧!
更多精彩
赞助商链接