La source RÉELLE de .NET Framework 2.0 est disponible sur Internet (à des fins éducatives) ici : http://www.microsoft.com/en-us/download/details.aspx?id=4917
Il s'agit de l'implémentation du langage C#. Vous pouvez utiliser 7zip pour le décompresser. Vous trouverez l'espace de nom de réflexion ici (relativement) :
. \sscli20\clr\src\bcl\system\reflection
Je cherche l'implémentation spécifique que vous demandez, mais c'est un bon début.
UPDATE : Désolé, mais je pense que c'est une impasse. Type.GetType()
appelle l'implémentation de base qui provient de System.Object. Si vous inspectez ce fichier de code ( .\sscli20\clr\src\bcl\system\object.cs
), vous trouverez que la méthode est extern
(voir le code ci-dessous). Une inspection plus poussée pourrait permettre de découvrir l'implémentation, mais elle n'est pas dans la BCL. Je soupçonne qu'elle se trouve quelque part dans le code C++.
// Returns a Type object which represent this object instance.
//
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern Type GetType();
MISE À JOUR (ENCORE) : J'ai creusé plus profondément et j'ai trouvé la réponse dans l'implémentation de la machine virtuelle CLR elle-même. (C'est en C++).
La première pièce du puzzle est ici :
\sscli20\clr\src\vm\ecall.cpp
Nous voyons ici le code qui fait correspondre l'appel externe à une fonction C++.
FCFuncStart(gObjectFuncs)
FCIntrinsic("GetType", ObjectNative::GetClass, CORINFO_INTRINSIC_Object_GetType)
FCFuncElement("InternalGetHashCode", ObjectNative::GetHashCode)
FCFuncElement("InternalEquals", ObjectNative::Equals)
FCFuncElement("MemberwiseClone", ObjectNative::Clone)
FCFuncEnd()
Maintenant, nous devons aller trouver ObjectNative::GetClass
... qui est ici :
\sscli20\clr\src\vm\comobject.cpp
et voici l'implémentation de 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
Une dernière chose, la mise en œuvre de GetTypeHandle
ainsi que d'autres fonctions de soutien se trouvent ici :
\sscli20\clr\src\vm\object.cpp