作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 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/
在 DotPeek 中查看 System.Linq.Enumerable 我注意到一些方法带有 [__DynamicallyInvokable] 属性。 这个属性有什么作用?它是由 DotPeek 添
我是一名优秀的程序员,十分优秀!