A quoi sert l’atsortingbut __DynamicallyInvokable?

En regardant dans System.Linq.Enumerable dans DotPeek, je remarque que certaines méthodes sont aromatisées avec un atsortingbut [__DynamicallyInvokable] .

Quel rôle joue cet atsortingbut? 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?

Il n’est pas documenté, mais il ressemble à l’une des optimisations de .NET 4.5. Il semble être utilisé pour amorcer le cache d’informations de type reflection, ce qui rend le code de reflection ultérieur sur les types de structure communs plus rapide. Il y a un commentaire à ce sujet dans la source de référence pour la propriété System.Reflection.Assembly.cs, RuntimeAssembly.Flags:

  // Each blessed API will be annotated with a "__DynamicallyInvokableAtsortingbute". // This "__DynamicallyInvokableAtsortingbute" 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 atsortingbute lookup. // If this atsortingbute type doesn't exist in the assembly, it means the assembly // doesn't contain any blessed APIs. Type invocableAtsortingbute = GetType("__DynamicallyInvokableAtsortingbute", false); if (invocableAtsortingbute != null) { Contract.Assert(((MetadataToken)invocableAtsortingbute.MetadataToken).IsTypeDef); ConstructorInfo ctor = invocableAtsortingbute.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, ce que pourrait signifier une “API bénie”. Bien que le contexte montre clairement que cela ne fonctionnera que sur les types du cadre lui-même. Il devrait y avoir un code supplémentaire quelque part qui vérifie l’atsortingbut appliqué aux types et aux méthodes. Aucune idée de l’emplacement de ce fichier, mais étant donné qu’il lui faudrait avoir une vue de tous les types de .NET pour avoir un impact sur la mise en cache, je ne peux que penser à Ngen.exe.

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

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