Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top