5

Reflectorを使用して.Netソースコードを分解しているときに、オブジェクトクラスの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)]ます。これは、.NET アセンブリではなく、ネイティブ プロシージャとして CLR 自体に実装されていることを意味します。

Microsoft SSCLI (別名 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 に答える