InternalEquals(object objA, object objB)的实现在哪里?

5

在使用Reflector对.Net源代码进行反汇编时,我发现Object类中的Equals实现引用了

bool InternalEquals(object objA, object objB);

再次提到的是与之相关的内容。
internal static extern bool InternalEquals(object objA, object objB);

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

2个回答

12

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

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

在SSCLI 2.0中,它的实现方式为(位于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

首先,在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()

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接