En regardant System.Linq.Enumerable
dans DotPeek, je remarque que certaines méthodes sont parfumées avec un [__DynamicallyInvokable]
attribut.
Quel rôle joue cet attribut? Est-ce quelque chose d'ajouté par DotPeek ou joue-t-il un autre rôle, en informant peut-être le compilateur sur la meilleure façon d'optimiser les méthodes?
c#
dynamic-invoke
Jamie Dixon
la source
la source
IReadOnlyCollection<T>
.System.ServiceModel v3
'sBasicHttpBinding.TextEncoding
(qui dans V4 est passé à une nouvelle classe de base et devientHttpBindingBase.TextEncoding
)Réponses:
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 de réflexion, ce qui accélère le code de réflexion ultérieur sur les types de framework courants. Il y a un commentaire à ce sujet dans la source de référence pour la propriété System.Reflection.Assembly.cs, RuntimeAssembly.Flags:
Sans plus d'indications sur ce que pourrait signifier une "API bénie". Bien qu'il soit clair d'après le contexte que cela ne fonctionnera que sur les types du framework lui-même. Il devrait y avoir du code supplémentaire quelque part qui vérifie l'attribut appliqué aux types et aux méthodes. Aucune idée de l'endroit où cela se trouve, mais étant donné qu'il faudrait avoir une vue de tous les types .NET pour avoir une chance de mettre en cache, je ne peux penser qu'à Ngen.exe.
la source
System.ServiceModel 3.0
). J'avais supposé que l'unification à la desmscorlib
références était en jeu, mais j'ai quand même beaucoup de choses à faire sur mon problème spécifique - je ferai rapport et / ou supprimerai tout ton trompeur à mes commentaires en temps voulu ...System.ServiceModel v3
, le chargement sous CLR4 se met automatiquement à niveau versSystem.ServiceModel v4
. Le plus amusant est que .NET 4.5 effectue une mise à jour sur place des bits deSystem.ServiceModel
chute dans une nouvelle classe de base en dessous et déplace la propriété d'un niveau vers le bas .J'ai trouvé qu'il était utilisé dans la
Runtime*Info.IsNonW8PFrameworkAPI()
suite de méthodes internes. Le fait de placer cet attribut sur un membre fait que IsNonW8PFrameworkAPI () le renvoiefalse
et rend ainsi le membre disponible dans les applications WinRT et ferme l'The API '...' cannot be used on the current platform.
exception.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.
la source
RuntimeAssembly.InvocableAttributeCtorToken
, qui sont appelés par lesIsNonW8PFrameworkAPI()
méthodes que vous mentionnez.