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

时间:2014-08-02 13:49:39

标签: c# delegates clr

确切地说(CLR源文件)可以找到SomeDelegate.Invoke方法的实际实现吗?

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

1 个答案:

答案 0 :(得分:1)

所以,这就是伏都教魔法的工作方式(从我通过浏览一小时的资料来发现):

  1. 有时会填充SomeDelegate类的方法表,运行时会遇到Invoke方法。
  2. 调用PreStubWorkervm\prestub.cpp),调用DoPrestub,调用MakeStubWorker
  3. MakeStubWorker看到该方法是运行时实现的(pMD->IsEEImpl),断言方法表(为什么询问方法表?)看起来像委托并调用COMDelegate::GetInvokeMethodStubvm\comdelegate.cp p)创建存根。
  4. COMDelegate::GetInvokeMethodStub方法(vm\comdelegate.cpp)调用调用COMDelegate::TheDelegateInvokeStubEmitDelegateInvoke方法的EmitMulticastInvoke
  5. StubLinkerCPU::EmitDelegateInvokeStubLinkerCPU::EmitMulticastInvoke方法在vm\i386\stublinkerx86.cpp文件(适用于x86)和vm\ppc\cgenppc.cpp(适用于PowerPC)中实施。这些方法非常简短,并且发出了Invoke方法的具体汇编/ CPU特定实现。
  6. 对方法实现的引用将放在SomeDelegate的方法表中。