gpt4 book ai didi

c# - 如何调用 FastEqualsCheck()?

转载 作者:可可西里 更新时间:2023-11-01 09:12:58 27 4
gpt4 key购买 nike

这主要是学术性的——但我正在研究 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com