我如何调用FastEqualsCheck()?

时间:2014-05-20 14:02:54

标签: c# .net

这主要是学术性的 - 但我正在研究ValueTypes的Equals()实现。源代码位于:http://referencesource.microsoft.com/#mscorlib/system/valuetype.cs#38

引起我注意的代码是:

    // if there are no GC references in this object we can avoid reflection 
    // and do a fast memcmp
    if (CanCompareBits(this))
        return FastEqualsCheck(thisObj, obj);

FastEqualsCheck()声明如下:

[System.Security.SecuritySafeCritical]  
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern bool FastEqualsCheck(Object a, Object b);

我的理解是' [MethodImplAttribute(MethodImplOptions.InternalCall)]'表示这是在CLR中实现的(源不可用),但我想我可以直接从我的代码中调用它。当我尝试时,我得到一个SecurityException

ECall methods must be packaged into a system module.

我可以自己拨打这些电话吗(或者仅供内部消费者使用)?如果我可以直接打电话给他们,这样做的适当方法是什么?

1 个答案:

答案 0 :(得分:5)

您不能自己调用​​这些方法。它们是internal,只能通过同一程序集中的方法调用。这正是异常告诉你的。

正如评论中所建议的那样,您可以查看SSCLI代码以了解实际实现情况。

此博客文章告诉您确切的位置:

http://blogs.msdn.com/b/xiangfan/archive/2008/09/01/magic-behind-valuetype-equals.aspx

SSCLI源代码的下载链接:

http://www.microsoft.com/en-us/download/details.aspx?id=4917

实际实施如下:

FCIMPL2(FC_BOOL_RET, ValueTypeHelper::FastEqualsCheck, Object* obj1,
    Object* obj2)
{
    WRAPPER_CONTRACT;
    STATIC_CONTRACT_SO_TOLERANT;

    _ASSERTE(obj1 != NULL);
    _ASSERTE(obj2 != NULL);
    _ASSERTE(!obj1->GetMethodTable()->ContainsPointers());
    _ASSERTE(obj1->GetSize() == obj2->GetSize());

    TypeHandle pTh = obj1->GetTypeHandle();

    FC_RETURN_BOOL(memcmp(obj1->GetData(),obj2->GetData(),pTh.GetSize()) == 0);
}

如您所见,他们只是执行memcmp。所以,你可以做的是在一个无人的DLL中创建这样的函数并调用它,这基本上是相同的。