Ответ 1
Источник ACTUAL для .NET Framework 2.0 доступен в Интернете (для образовательных целей) здесь: http://www.microsoft.com/en-us/download/details.aspx?id=4917
Это реализация языка С#. Вы можете использовать 7zip, чтобы распаковать его. Вы найдете пространство имен отражения здесь (относительно):
.\Sscli20\CLR\SRC\Bcl\система\отражения
Я копаю для конкретной реализации, о которой вы просите, но это хороший старт.
ОБНОВЛЕНИЕ: Извините, но я думаю, что это тупик. Type.GetType()
вызывает базовую реализацию, которая поступает из System.Object. Если вы проверите этот код (.\sscli20\clr\src\bcl\system\object.cs
), вы найдете способ extern
(см. Код ниже). Дальнейшая проверка может выявить реализацию, но ее не в BCL. Я подозреваю, что это будет где-то в коде С++.
// Returns a Type object which represent this object instance.
//
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern Type GetType();
UPDATE (AGAIN): Я углубился и нашел ответ в реализации самой виртуальной машины CLR. (Его в С++).
Первая часть головоломки находится здесь:
\ sscli20\CLR\SRC\ут\ecall.cpp
Здесь мы видим код, который отображает внешний вызов функции С++.
FCFuncStart(gObjectFuncs)
FCIntrinsic("GetType", ObjectNative::GetClass, CORINFO_INTRINSIC_Object_GetType)
FCFuncElement("InternalGetHashCode", ObjectNative::GetHashCode)
FCFuncElement("InternalEquals", ObjectNative::Equals)
FCFuncElement("MemberwiseClone", ObjectNative::Clone)
FCFuncEnd()
Теперь нам нужно найти find ObjectNative::GetClass
... который находится здесь:
\ sscli20\CLR\SRC\ут\comobject.cpp
и вот реализация GetType
:
FCIMPL1(Object*, ObjectNative::GetClass, Object* pThis)
{
CONTRACTL
{
THROWS;
SO_TOLERANT;
DISABLED(GC_TRIGGERS); // FCallCheck calls ForbidenGC now
INJECT_FAULT(FCThrow(kOutOfMemoryException););
SO_TOLERANT;
MODE_COOPERATIVE;
}
CONTRACTL_END;
OBJECTREF objRef = ObjectToOBJECTREF(pThis);
OBJECTREF refType = NULL;
TypeHandle typeHandle = TypeHandle();
if (objRef == NULL)
FCThrow(kNullReferenceException);
typeHandle = objRef->GetTypeHandle();
if (typeHandle.IsUnsharedMT())
refType = typeHandle.AsMethodTable()->GetManagedClassObjectIfExists();
else
refType = typeHandle.GetManagedClassObjectIfExists();
if (refType != NULL)
return OBJECTREFToObject(refType);
HELPER_METHOD_FRAME_BEGIN_RET_ATTRIB_2(Frame::FRAME_ATTR_RETURNOBJ, objRef, refType);
if (!objRef->IsThunking())
refType = typeHandle.GetManagedClassObject();
else
refType = CRemotingServices::GetClass(objRef);
HELPER_METHOD_FRAME_END();
return OBJECTREFToObject(refType);
}
FCIMPLEND
Последнее: реализация GetTypeHandle
и некоторые другие поддерживающие функции можно найти здесь:
\ sscli20\CLR\SRC\ут\object.cpp