202 votes

A quoi sert l'attribut __DynamicallyInvokable?

En regardant à travers System.Linq.Enumerable dans DotPeek, j'ai remarqué que certaines méthodes sont aromatisées avec un attribut [__DynamicallyInvokable] .

Quel rôle joue cet attribut? Est-ce quelque chose ajouté par DotPeek ou joue-t-il un autre rôle, informant peut-être le compilateur sur la meilleure façon d'optimiser les méthodes?

156voto

Hans Passant Points 475940

Il est sans-papiers, mais cela ressemble à de la, des optimisations .NET 4.5. Il semble être utilisé pour amorcer la réflexion des informations de type de cache, de décisions ultérieures code de réflexion sur le cadre commun des types courir plus vite. Il y a un commentaire à ce sujet dans la Source de Référence pour le Système.De la réflexion.De l'assemblée.cs, RuntimeAssembly.Propriété 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;
 }

Sans autres indices de ce qu'un "béni API" peut signifier. Bien qu'il est clair d'après le contexte que cela ne fonctionne que sur des types dans le cadre lui-même. Il devrait y avoir un code supplémentaire quelque part qui vérifie l'attribut appliqué à des types et des méthodes. Aucune idée d'où c'est situé, mais étant donné qu'il aurait besoin d'avoir une vue de tous .Types de filets d'avoir un coup de feu à la mise en cache, je ne peux que penser à Ngen.exe.

28voto

Stefan Dragnev Points 3466

J'ai constaté qu'il est utilisé dans la suite de méthodes internes Runtime*Info.IsNonW8PFrameworkAPI() . Si cet attribut est placé sur un membre, IsNonW8PFrameworkAPI () lui renvoie false ce qui rend le membre disponible dans les applications WinRT et ferme l'exception The API '...' cannot be used on the current platform. .

Les rédacteurs du profileur doivent placer cet attribut sur les membres émis par leur profileur dans des assemblys de structure s'ils souhaitent y accéder sous WinRT.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X