68 votes

Qu'est-ce que [DllImport ("QCall")]?

De nombreuses méthodes dans le .Net de la bibliothèque sont mis en œuvre dans le code natif. Ceux qui viennent de l'infrastructure elle-même sont marqués avec [MethodImpl(MethodImplOptions.InternalCall)]. Ceux qui viennent de certains non géré DLL sont marqués avec [DllImport] (par exemple, [DllImport("kernel32.dll")]). Jusqu'à présent, rien d'inhabituel.

Mais lors de l'écriture de répondre à une autre question, j'ai découvert il y a beaucoup de méthodes marqué avec [DllImport("QCall")]. Ils semblent être la mise en œuvre interne de .Net (par exemple, GC._Collect()).

Ma question est: qu'est-Ce exactement ne [DllImport("QCall")] moyenne? Quelle est la différence entre [DllImport("QCall")] et [MethodImpl(MethodImplOptions.InternalCall)]?

36voto

SLaks Points 391154

J'ai interrogé des personnes de l'équipe .Net à ce sujet.

Les QCalls sont des appels aux méthodes natives dans le runtime CLR. Ils se comportent comme les autres [DllImport] s, mais ils sont plus rapides car ils émettent des hypothèses spécifiques (non documentées) sur le fonctionnement des méthodes natives, ce qui leur permet de passer différentes vérifications de marshalling, de vérification de cohérence et d'exception.

InternalCall est différent; c'est pour les appels pour des choses spéciales de type réflexion qui sont générées au moment de l'exécution (ce n'était pas très clair).

0voto

Tim Lovell-Smith Points 2635

Complétant @SLaks réponse, MethodImplOptions.InternalCall est brièvement décrite ici: ThreadPoolPriority, et MethodImplAttribute.

Fondamentalement InternalCall raconte le moteur d'exécution d'aller vérifier de ses propres table des fonctions nommées. Cette table existe en raison d'un fichier source dans l'exécution de code à déclarer explicitement lorsque l'exécution est compilé. Il a une liste de pointeurs de fonction pour la mise en œuvre de tous les appels internes:

static ECFunc gGuidFuncs[] = { {FCFuncElement("CompleteGuid", NULL, (LPVOID)GuidNative::CompleteGuid)}, {NULL, NULL, NULL} };

Cette déclaration indique au moteur d'exécution que le corps de la méthode pour la gestion de Guid.CompleteGuid méthode est en fait le C++ natif GuidNative::CompleteGuid fonction. L'article n'est pas très clair sur la façon dont le marshaling des œuvres dans ce lieu, mais en général c'est clairement jusqu'à l'exécution de la mise en œuvre, car il en a) déclare le corps de la fonction [qui dépend du marshaling format] et b) tout regroupement.

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