2008-12-21 3 views
5

Während das .Net Source Code mit Reflektor Auseinanderbauen ich von der Implementierung Equals in der Objektklasse kam und es bezieht sich aufWo ist die Implementierung von InternalEquals (Objekt objA, Objekt objB)

bool InternalEquals(object objA, object objB); 

wieder Welche bezieht sich zu

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

ich jetzt verwirrt in Bezug auf, wo die Umsetzung dieser InternalEquals(object objA, object objB) Funktion zu finden und wie sie diese Funktion und in dem verwendet wird .NET-Assembly ist diese Funktion definiert und auch wenn alles und jedes von Grund auf neu geschrieben für das .Net-Quellcode, warum kann ich die Implementierung dieser Funktion nicht finden?

Antwort

12

Es wird als [MethodImpl(MethodImplOptions.InternalCall)] deklariert. Es bedeutet, dass es in der CLR selbst als native Prozedur und nicht als .NET-Assembly implementiert ist.

Sie können einen ähnlichen CLR-Quellcode anzeigen, indem Sie Microsoft SSCLI (aka Rotor) betrachten.

In SSCLI 2.0 es implementiert, wie (in 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

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

+0

Danke Fake Jim, ich habe die Antwort aktualisiert, um deinen Link einzuschließen. –

0

Zunächst finden in sscli20 \ clr \ src \ vm \ ecall.cpp Funktionszuordnung ("InternalEquals" -> ObjectNative :: Equals) :

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

Als nächstes finden Sie eine Implementierung ObjectNative :: Equals (veröffentlicht von Mehrdad Afshari)

Verwandte Themen