Где на самом деле существует nativeGetUninitializedObject? - PullRequest
3 голосов
/ 01 февраля 2011

Мне было любопытно узнать о некоторых вещах сериализации, поэтому я начал изучать FormatterServices и нашел метод с именем nativeGetUninitializedObject, который фактически обрабатывает инициализацию (без вызова custructor) данного типа.Этот метод снабжен ключевым словом extern и следующим атрибутом: [MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]

Мне интересно, где этот метод существует на самом деле?Какой код вызывает CLR для инициализации данного типа (без вызова конструктора)?

Ответы [ 2 ]

6 голосов
/ 01 февраля 2011

Метод существует в CLR. JIT-компилятор имеет доступ к таблице внутри CLR, которая содержит адреса всех функций MethodImplOptions.InternalCall. Раздел таблицы, относящийся к вашему вопросу, выглядит следующим образом в исходном коде SSCLI20 (clr / src / vm / ecall.cpp):

FCFuncStart(gSerializationFuncs)
    FCFuncElement("nativeGetSafeUninitializedObject", ReflectionSerialization::GetSafeUninitializedObject)
    FCFuncElement("nativeGetUninitializedObject", ReflectionSerialization::GetUninitializedObject)
FCFuncEnd()

Чтобы выполнить вызов метода, он просто ищет имя функции в этой таблице и генерирует прямую инструкцию CALL по адресу функции, как указано в таблице. Очень быстрый прямой переход от управляемого кода к коду, написанному на C ++ внутри CLR.

Метод ReflectionSerialization :: GetUninitializedObject () находится внутри clr / src / vm / refleinvocation.cpp, он слишком велик для размещения здесь. Вы можете взглянуть на загружаемый исходный код SSCLI20. Есть куча проверок ошибок, затем вызов необработанного метода Allocate () для выделения памяти для объекта. Нет вызова конструктора.

4 голосов
/ 01 февраля 2011

Этот метод фактически существует в собственной части CLR.MethodImplOptions.InternalCall означает вызов, который перенаправляется в собственный код CLR и реализуется там.

С MSDN :

Указывает внутренний вызов.Внутренний вызов - это вызов метода, который реализован в самой общеязыковой среде выполнения.

...