在使用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源代码,那我为什么找不到这个函数的实现呢。
答案 0 :(得分: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
答案 1 :(得分: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发布)