这主要是学术性的 - 但我正在研究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.
我可以自己拨打这些电话吗(或者仅供内部消费者使用)?如果我可以直接打电话给他们,这样做的适当方法是什么?
答案 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中创建这样的函数并调用它,这基本上是相同的。