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

在使用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源代码,那么为什么我找不到这个函数的实现。

它被声明为[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 

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