SomeDelegate.Invoke究竟在哪里实现,它是如何“连接”到委托类的

本文关键字:连接 在哪里 究竟 Invoke 实现 SomeDelegate | 更新日期: 2023-09-27 18:16:09

(

CLR 源文件(究竟在哪里可以找到 SomeDelegate.Invoke 方法的实际实现?

.Net 运行时如何知道调用SomeDelegate.Invoke应该导致调用该实现?请记住,SomeDelegate.Invoke方法可以具有任意数量的参数。

SomeDelegate.Invoke究竟在哪里实现,它是如何“连接”到委托类的

所以,以下是巫毒魔法的工作原理(从我浏览来源一小时发现(:

  1. 有时,将填充 SomeDelegate 类的方法表,并且运行时偶然发现Invoke方法。
  2. PreStubWorker(vm'prestub.cpp(被调用,它调用DoPrestub,它调用MakeStubWorker
  3. MakeStubWorker看到该方法是运行时实现的(pMD->IsEEImpl(,断言方法表(为什么要问方法表?(看起来像委托,并调用COMDelegate::GetInvokeMethodStub(vm'comdelegate.cp p(来创建存根。
  4. COMDelegate::GetInvokeMethodStub方法(vm'comdelegate.cpp(调用COMDelegate::TheDelegateInvokeStub EmitDelegateInvokeEmitMulticastInvoke方法。
  5. StubLinkerCPU::EmitDelegateInvokeStubLinkerCPU::EmitMulticastInvoke 方法在vm'i386'stublinkerx86.cpp文件(对于 x86(和vm'ppc'cgenppc.cpp(对于 PowerPC(中实现。这些方法非常短,并发出Invoke方法的具体程序集/CPU 特定实现。
  6. 对方法实现的引用被放到SomeDelegate的方法表中。