una para imagenes imagen emplea atributos atributo agregar c# dynamic-invoke

c# - imagenes - ¿Para qué es el atributo__DynamicallyInvokable?



en html, el atributo alt se emplea para (2)

Mirando a través de System.Linq.Enumerable en DotPeek observo que algunos métodos están aromatizados con un atributo [__DynamicallyInvokable] .

¿Qué papel juega este atributo? ¿Es algo agregado por DotPeek o juega otro papel, tal vez informando al compilador sobre la mejor manera de optimizar los métodos?


Descubrí que se usa en el conjunto de métodos internos Runtime*Info.IsNonW8PFrameworkAPI() . Tener este atributo colocado en un miembro hace que IsNonW8PFrameworkAPI () devuelva false para él y, por lo tanto, hace que el miembro esté disponible en las aplicaciones WinRT y se cierra. The API ''...'' cannot be used on the current platform. excepción.

Los escritores de Profiler deben colocar este atributo en los miembros emitidos por su generador de perfiles en los ensamblados de framework, si quieren acceder a ellos bajo WinRT.


No está documentado, pero parece ser una de las optimizaciones en .NET 4.5. Parece que se utiliza para preparar el caché de información del tipo de reflexión, haciendo que el código de reflexión posterior en los tipos de marcos comunes se ejecute más rápido. Hay un comentario al respecto en la fuente de referencia para la propiedad 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; }

Sin más pistas sobre lo que podría significar una "bendita API". Aunque está claro por el contexto que esto solo funcionará en los tipos en el marco mismo. Debería haber un código adicional en alguna parte que verifique el atributo aplicado a los tipos y métodos. No tengo idea de dónde está ubicado, pero dado que debería necesitar tener una vista de todos los tipos de .NET para tener una oportunidad en el almacenamiento en caché, solo puedo pensar en Ngen.exe.