5

在使用 Reflector 反汇编 .Net 源代码时,我发现了 Object Class 中的 Equals 实现,它指的是

bool InternalEquals(object objA, object objB);

这又是指

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

我现在很困惑在哪里可以找到这个InternalEquals(object objA, object objB)函数的实现,它是如何使用这个函数的,这个函数是在哪个 .Net 程序集中定义的,以及如果每个东西都是从头开始为 .Net 源代码编写的,那么为什么我找不到这个函数的实现。

4

2 回答 2

12

它被声明为[MethodImpl(MethodImplOptions.InternalCall)]. 这意味着它是在 CLR 本身中实现的,作为本机过程,而不是 .NET 程序集。

您可以通过查看Microsoft SSCLI (aka Rotor)来查看类似的 CLR 源代码。

在 SSCLI 2.0 中,它被实现为 (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
于 2008-12-21T09:45:01.870 回答
0

首先,在 sscli20\clr\src\vm\ecall.cpp 中找到函数映射("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()

接下来,找到一个实现 ObjectNative::Equals(由 Mehrdad Afshari 发布)

于 2011-03-08T02:01:10.583 回答