- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这主要是学术性的——但我正在研究 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 方法必须打包到系统模块中。
我可以自己调用这些电话吗(或者它们仅供内部使用)?如果我可以直接调用他们,这样做的合适方式是什么?
最佳答案
您不能自己调用这些方法。它们是内部的
,只能由同一程序集中的方法调用。这正是异常告诉您的内容。
正如评论中所建议的,您可以查看实际实现的 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 中创建一个这样的函数并调用它,这在本质上是相同的。
关于c# - 如何调用 FastEqualsCheck()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23762003/
这主要是学术性的——但我正在研究 ValueTypes 的 Equals() 的实现。源代码在这里:http://referencesource.microsoft.com/#mscorlib/sys
我是一名优秀的程序员,十分优秀!