小编典典

__DynamicallyInvokable 属性有什么用?

all

在DotPeekSystem.Linq.Enumerable中查看时,我注意到某些方法带有[__DynamicallyInvokable]属性。

这个属性起什么作用?它是由 DotPeek 添加的还是起到了其他作用,也许会告知编译器如何最好地优化方法?


阅读 127

收藏
2022-07-14

共1个答案

小编典典

它没有记录,但它看起来像是 .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;
 }

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

2022-07-14