在CLR中使用callvirt时如何解决方法?

时间:2011-06-21 09:04:53

标签: .net clr cil internals

它是在编译时完成的吗?因为可以在编译时确定要调用的方法的MethodTable的索引。

或者它是在运行时完成的吗?

callvirt的方法标记参数是什么?

2 个答案:

答案 0 :(得分:3)

我已经完成了关于callvirt在运行时如何工作的blog post

在编译时,callvirt指令的参数采用具体的MethodDefMemberRef标记,引用要调用的'base'方法(这定义了方法参数,其他事情)

在运行时,作为进行类型初始化的一部分,CLR确定哪些方法相互覆盖,并为每个虚拟“base”方法在MethodTable vtable中指定一个槽。然后,每种类型都使用指针填充该槽,该指针指向应该用于该类型实例的基本方法的虚拟调用的任何实际方法实现。然后用它来进行虚拟调用,如我的帖子所述。

答案 1 :(得分:0)

当您拥有虚拟方法或实例方法并编译它们时。 您的方法将具有callvirt标记,并将由CLR作为callvirt调用,除非静态方法将具有调用标记并将直接调用。

Callvirt将导致该方法在运行时被称为虚拟。

在运行时,CLR将检查您的方法是否已实例化其对象。 CLR还会检查您的方法是否已被其派生类型覆盖。如果未覆盖,则将调用您的方法。 如果是,那么将调用其派生的方法。