Где на самом деле существует NationalgetUnitializebject?
-
28-10-2019 - |
Вопрос
Мне было любопытно о некоторых вещах сериализации, поэтому я пошел FormatterServices
и нашел метод под названием nativeGetUninitializedObject
Это на самом деле обрабатывает инициализацию (не называя костюктора) данного типа. Этот метод украшен extern
ключевое слово и следующий атрибут: [MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
Мне нужно интересно: где этот метод на самом деле существует? Какой код вызовет CLR, чтобы получить инициализированного типа (не вызывая конструктор)?
Решение
Этот метод фактически существует в местной части CLR. А MethodImplOptions.InternalCall
означает вызов, который перенаправляется в нативный код CLR и реализуется там.
Из MSDN:
Указывает внутренний вызов. Внутренний вызов - это призыв к методу, который реализован в самой среде выполнения общего языка.
Другие советы
Метод существует в CLR. Компилятор JIT имеет доступ к таблице внутри CLR, которая содержит адреса всех функций MethodImPloptionS.InternalCall. Раздел таблицы, относящийся к вашему вопросу, выглядит так в исходном коде SSCLI20 (CLR/SRC/VM/ECALL.CPP):
FCFuncStart(gSerializationFuncs)
FCFuncElement("nativeGetSafeUninitializedObject", ReflectionSerialization::GetSafeUninitializedObject)
FCFuncElement("nativeGetUninitializedObject", ReflectionSerialization::GetUninitializedObject)
FCFuncEnd()
Чтобы подготовить вызов метода, он просто ищет имя функции в этой таблице и генерирует инструкцию прямого вызова по адресу функции, как указано в таблице. Очень быстрый, прямой переход от управляемого кода к коду, написанному в C ++, внутри CLR.
Метод Reflectionserialization :: getUninitializedObject () живет внутри CLR/SRC/VM/ReflectionInvocation.cpp, он слишком большой, чтобы публиковать здесь. Вы можете посмотреть на загружаемый исходный код SSCLI20. Существует множество проверки ошибок, затем вызов метода Raw Allocate () для распределения памяти для объекта. Нет конструктора.