SomeDelegate.Invoke究竟在哪里实现,它是如何“连接”到委托类的
本文关键字:连接 在哪里 究竟 Invoke 实现 SomeDelegate | 更新日期: 2023-09-27 18:16:09
(
CLR 源文件(究竟在哪里可以找到 SomeDelegate.Invoke
方法的实际实现?
.Net 运行时如何知道调用SomeDelegate.Invoke
应该导致调用该实现?请记住,SomeDelegate.Invoke
方法可以具有任意数量的参数。
所以,以下是巫毒魔法的工作原理(从我浏览来源一小时发现(:
- 有时,将填充
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
的方法表中。