Как разрешается метод при использовании callvirt в CLR? - PullRequest
1 голос
/ 21 июня 2011

Это сделано во время компиляции?Поскольку индекс в MethodTable вызываемого метода может быть определен во время компиляции.

Или это выполняется во время выполнения?

И каков аргумент токена метода для callvirt?

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

Я написал в блоге о том, как callvirt работает во время выполнения.

Во время компиляции аргумент инструкции callvirt принимает конкретный MethodDef или * 1007.* token, ссылающийся на вызываемый «базовый» метод (среди прочего, он определяет аргументы метода)

Во время выполнения, как часть инициализации типа, CLR определяет, какие методы переопределяют друг друга, иназначает слот в таблице MethodTable vtable для каждого виртуального «базового» метода.Каждый тип затем заполняет этот слот указателем на то, какую фактическую реализацию метода следует использовать для виртуальных вызовов этого базового метода для экземпляров этого типа.Затем он используется для виртуального вызова, как описано в моем посте.

0 голосов
/ 21 июня 2011

Если у вас есть виртуальный метод или метод Instance, и вы их компилируете. Ваш метод будет иметь токен callvirt и будет вызываться CLR как callvirt, если только статический метод не будет иметь токен вызова и будет вызываться напрямую.

Callvirt приведет к тому, что метод будет вызываться как виртуальный во время выполнения.

Во время выполнения CLR проверит ваш метод, был ли создан его объект. И CLR также проверяет, был ли ваш метод переопределен его производным типом. Если он не переопределен, будет вызван ваш метод. Если да, то будет вызван его производный метод.

...