Метод существует в 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 () для выделения памяти для объекта. Нет вызова конструктора.