gpt4 book ai didi

c# - __DynamicallyInvokable 属性有什么用?

转载 作者:IT王子 更新时间:2023-10-29 03:30:37 33 4
gpt4 key购买 nike

在 DotPeek 中查看 System.Linq.Enumerable 我注意到一些方法带有 [__DynamicallyInvokable] 属性。

这个属性有什么作用?它是由 DotPeek 添加的东西还是它扮演了另一个角色,也许是告知编译器如何最好地优化方法?

最佳答案

它没有记录,但看起来像是 .NET 4.5 中的优化之一。它似乎用于启动反射类型信息缓存,使后续在常见框架类型上的反射代码运行得更快。在 System.Reflection.Assembly.cs 的引用源中有关于它的评论,RuntimeAssembly.Flags 属性:

 // Each blessed API will be annotated with a "__DynamicallyInvokableAttribute".
// This "__DynamicallyInvokableAttribute" is a type defined in its own assembly.
// So the ctor is always a MethodDef and the type a TypeDef.
// We cache this ctor MethodDef token for faster custom attribute lookup.
// If this attribute type doesn't exist in the assembly, it means the assembly
// doesn't contain any blessed APIs.
Type invocableAttribute = GetType("__DynamicallyInvokableAttribute", false);
if (invocableAttribute != null)
{
Contract.Assert(((MetadataToken)invocableAttribute.MetadataToken).IsTypeDef);

ConstructorInfo ctor = invocableAttribute.GetConstructor(Type.EmptyTypes);
Contract.Assert(ctor != null);

int token = ctor.MetadataToken;
Contract.Assert(((MetadataToken)token).IsMethodDef);

flags |= (ASSEMBLY_FLAGS)token & ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_TOKEN_MASK;
}

没有进一步暗示“有福的 API”可能意味着什么。尽管从上下文中可以清楚地看出这只适用于框架本身的类型。某处应该有额外的代码来检查应用于类型和方法的属性。不知道它位于何处,但考虑到它需要查看所有 .NET 类型才能进行缓存,我只能想到 Ngen.exe。

关于c# - __DynamicallyInvokable 属性有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12550749/

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