确切地说(CLR源文件)可以找到SomeDelegate.Invoke
方法的实际实现吗?
.Net运行时如何知道调用SomeDelegate.Invoke
应该导致调用该实现?请记住,SomeDelegate.Invoke
方法可以包含任意数量的参数。
答案 0 :(得分:1)
所以,这就是伏都教魔法的工作方式(从我通过浏览一小时的资料来发现):
SomeDelegate
类的方法表,运行时会遇到Invoke
方法。PreStubWorker
(vm\prestub.cpp
),调用DoPrestub
,调用MakeStubWorker
MakeStubWorker
看到该方法是运行时实现的(pMD->IsEEImpl
),断言方法表(为什么询问方法表?)看起来像委托并调用COMDelegate::GetInvokeMethodStub
( vm\comdelegate.cp
p)创建存根。COMDelegate::GetInvokeMethodStub
方法(vm\comdelegate.cpp
)调用调用COMDelegate::TheDelegateInvokeStub
和EmitDelegateInvoke
方法的EmitMulticastInvoke
。StubLinkerCPU::EmitDelegateInvoke
和StubLinkerCPU::EmitMulticastInvoke
方法在vm\i386\stublinkerx86.cpp
文件(适用于x86)和vm\ppc\cgenppc.cpp
(适用于PowerPC)中实施。这些方法非常简短,并且发出了Invoke
方法的具体汇编/ CPU特定实现。SomeDelegate
的方法表中。