2008-12-21 8 views
5

Bien que désassembler .Net code source en utilisant réflecteur, je suis tombé sur la mise en œuvre Equals dans la classe d'objets et il se réfère àOù est la mise en œuvre de InternalEquals (objet objA, objet objB)

bool InternalEquals(object objA, object objB); 

Ce qui renvoie à nouveau à

internal static extern bool InternalEquals(object objA, object objB); 

Je suis maintenant confus au sujet où trouver la mise en œuvre de cette fonction InternalEquals(object objA, object objB) et comment est-il utilise cette fonction et dans lequel l'assemblage .Net est cette fonction définie et si chacun et tout est écrit à partir de zéro pour la Code Source .Net, alors pourquoi suis-je incapable de trouver l'implémentation de cette fonction.

Répondre

12

Il est déclaré comme [MethodImpl(MethodImplOptions.InternalCall)]. Cela signifie qu'il est implémenté dans le CLR lui-même, en tant que procédure native et non en tant qu'ensemble .NET.

Vous pouvez afficher un code source CLR similaire en regardant Microsoft SSCLI (aka Rotor).

Dans SSCLI 2.0, il est implémenté comme (en sscli20/clr/src/vm/comobject.cpp):

FCIMPL2(FC_BOOL_RET, ObjectNative::Equals, Object *pThisRef, Object *pCompareRef) 
{ 
    CONTRACTL 
    { 
     THROWS; 
     DISABLED(GC_NOTRIGGER); 
     INJECT_FAULT(FCThrow(kOutOfMemoryException);); 
     MODE_COOPERATIVE; 
     SO_TOLERANT;   
    } 
    CONTRACTL_END; 

    if (pThisRef == pCompareRef)  
     FC_RETURN_BOOL(TRUE); 

    // Since we are in FCALL, we must handle NULL specially. 
    if (pThisRef == NULL || pCompareRef == NULL) 
     FC_RETURN_BOOL(FALSE); 

    MethodTable *pThisMT = pThisRef->GetMethodTable(); 

    // If it's not a value class, don't compare by value 
    if (!pThisMT->IsValueClass()) 
     FC_RETURN_BOOL(FALSE); 

    // Make sure they are the same type. 
    if (pThisMT != pCompareRef->GetMethodTable()) 
     FC_RETURN_BOOL(FALSE); 

    // Compare the contents (size - vtable - sink block index). 
    BOOL ret = memcmp(
     (void *) (pThisRef+1), 
     (void *) (pCompareRef+1), 
     pThisRef->GetMethodTable()->GetBaseSize() - sizeof(Object) - sizeof(int)) == 0; 

    FC_GC_POLL_RET(); 

    FC_RETURN_BOOL(ret); 
} 
FCIMPLEND 
+0

Lien vers SSCLI: http://www.microsoft. com/downloads/details.aspx? FamilyId = 8C09FD61-3F26-4555-AE17-3121B4F51D4D & displaylang = fr –

+0

Merci Fake Jim, j'ai mis à jour la réponse pour inclure votre lien. –

0

Tout d'abord, trouver dans sscli20 \ clr \ src \ vm \ ecall.cpp mappage de fonction ("InternalEquals" -> ObjectNative :: Égal) :

FCFuncStart(gObjectFuncs) 
    FCIntrinsic("GetType", ObjectNative::GetClass, CORINFO_INTRINSIC_Object_GetType) 
    FCFuncElement("InternalGetHashCode", ObjectNative::GetHashCode) 
    FCFuncElement("InternalEquals", ObjectNative::Equals) 
    FCFuncElement("MemberwiseClone", ObjectNative::Clone) 
FCFuncEnd() 

Ensuite, trouver une implémentation ObjectNative :: Equals (publié par Mehrdad Afshari)

Questions connexes