gpt4 book ai didi

c# - SomeDelegate.Invoke 究竟在哪里实现以及它是如何 "wired"到委托(delegate)类

转载 作者:太空宇宙 更新时间:2023-11-03 13:18:45 25 4
gpt4 key购买 nike

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

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

最佳答案

所以,这是巫毒魔法的工作原理(根据我浏览一个小时的资源发现的内容):

  1. 有时,SomeDelegate 类的方法表被填充,运行时偶然发现 Invoke 方法。
  2. PreStubWorker (vm\prestub.cpp) 被调用,它调用DoPrestub,它调用MakeStubWorker
  3. MakeStubWorker 看到方法是运行时实现的(pMD->IsEEImpl),断言方法表(为什么要问方法表?)看起来像一个委托(delegate)并调用 COMDelegate::GetInvokeMethodStub (vm\comdelegate.cpp) 来创建 stub 。
  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的方法表中。

关于c# - SomeDelegate.Invoke 究竟在哪里实现以及它是如何 "wired"到委托(delegate)类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25095709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com