我正在研究 call 与 callvirt 操作码以及一路上遇到的所有问题。
你可以在网上看说明,但是当你遇到这样的情况时
callvirt 指令调用对象上的后期绑定方法。也就是说,该方法是根据 obj 的运行时类型而不是方法指针中可见的编译时类来选择的。
您知道这不是完整的故事,因为 callvirt 几乎是由 C# 编译器发出的,并且实现细节弥补了所有差异。
我认为 callvirt 内部所做的是检查方法表中的元数据标记是否是虚拟的,如果不是虚拟的,则不会真正打扰对象的 vtable。 但我怎么知道?
有人可以解释一下运行时代码在处理操作码方面是如何构造的(我猜是 JITter),以便我可以更轻松地浏览源代码并理解实现细节。
我们可以用 2-3 种不同的方式来处理这个问题...... 1)操作码类: System.Reflection.Emit 命名空间中的 OpCodes 类提供 Microsoft 中间语言 (MSIL) 指令的字段表示形式,以供 ILGenerator 类成员发出。当您想要在 .NET 代码中动态发出 IL 指令时,可以使用此类。