IL 操作码在 .NET 运行时源代码中的实现位置和方式

问题描述 投票:0回答:1

我正在研究 call 与 callvirt 操作码以及一路上遇到的所有问题。

你可以在网上看说明,但是当你遇到这样的情况时

callvirt 指令调用对象上的后期绑定方法。也就是说,该方法是根据 obj 的运行时类型而不是方法指针中可见的编译时类来选择的。

您知道这不是完整的故事,因为 callvirt 几乎是由 C# 编译器发出的,并且实现细节弥补了所有差异。

认为 callvirt 内部所做的是检查方法表中的元数据标记是否是虚拟的,如果不是虚拟的,则不会真正打扰对象的 vtable。 但我怎么知道?

有人可以解释一下运行时代码在处理操作码方面是如何构造的(我猜是 JITter),以便我可以更轻松地浏览源代码并理解实现细节。

c# clr cil
1个回答
0
投票

我们可以用 2-3 种不同的方式来处理这个问题...... 1)操作码类: System.Reflection.Emit 命名空间中的 OpCodes 类提供 Microsoft 中间语言 (MSIL) 指令的字段表示形式,以供 ILGenerator 类成员发出。当您想要在 .NET 代码中动态发出 IL 指令时,可以使用此类。

  1. 使用CodeDOM构建和编译代码树。 构建表达式树并编译它。 一条又一条 IL 指令生成代码。 向 CLR 添加新的字节码指令:如果要向 CLR 添加新的字节码指令,则需要更改 opcode.def
© www.soinside.com 2019 - 2024. All rights reserved.