Mirando a través System.Linq.Enumerable
de DotPeek, noto que algunos métodos tienen sabor a [__DynamicallyInvokable]
atributo.
¿Qué papel juega este atributo? ¿Es algo agregado por DotPeek o desempeña otro papel, quizás informando al compilador sobre la mejor manera de optimizar los métodos?
c#
dynamic-invoke
Jamie Dixon
fuente
fuente
IReadOnlyCollection<T>
.System.ServiceModel v3
'sBasicHttpBinding.TextEncoding
(que en V4 se ha movido a una nueva clase base y se convierte enHttpBindingBase.TextEncoding
)Respuestas:
No está documentado, pero parece una de las optimizaciones en .NET 4.5. Parece que se usa para cebar la caché de información de tipo de reflexión, lo que hace que el código de reflexión posterior en los tipos de marco 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:
Sin más pistas sobre lo que podría significar una "API bendecida". Aunque está claro por el contexto que esto solo funcionará en 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 se encuentra, pero dado que tendría que tener una vista de todos los tipos .NET para tener una oportunidad de almacenamiento en caché, solo puedo pensar en Ngen.exe.
fuente
System.ServiceModel 3.0
). Supuse que la unificación a lamscorlib
referencia estaba en juego, pero tengo que dar muchas vueltas sobre mi problema específico para hacer de todos modos: informaré y / o eliminaré cualquier tono engañoso de mis comentarios a su debido tiempo ...System.ServiceModel v3
, lo carga bajo actualizaciones automáticas CLR4 aSystem.ServiceModel v4
. Lo divertido es que .NET 4.5 realiza una actualización in situ de los bits deSystem.ServiceModel
caída en una nueva clase base debajo y mueve la propiedad a un nivel inferior .Descubrí que se usa en el
Runtime*Info.IsNonW8PFrameworkAPI()
conjunto de métodos internos. Tener este atributo colocado en un miembro hace que IsNonW8PFrameworkAPI () regresefalse
por él y, por lo tanto, hace que el miembro esté disponible en las aplicaciones WinRT y cierra laThe API '...' cannot be used on the current platform.
excepción.Los escritores de perfiles deben colocar este atributo en los miembros emitidos por su generador de perfiles en ensamblajes de marco, si desean acceder a ellos en WinRT.
fuente
RuntimeAssembly.InvocableAttributeCtorToken
, que se llama por losIsNonW8PFrameworkAPI()
métodos que mencionas.