La raison pour laquelle C# cdecl
et C __stdcall
coexistent dans P/Invoke
Dans l'interopérabilité P/Invoke entre C# et C, il arrive souvent qu'une fonction C# utilise la convention d'appel cdecl
, tandis que son homologue C utilise la signature __stdcall
. Cette inadéquation provient des choix de conventions d’appel qui se sont historiquement poursuivis jusqu’à ce jour.
__stdcall
: Nettoyage de l'appelant des fonctions Windows
__stdcall
Hérite de la convention d'appel Pascal 16 bits et constitue la convention d'appel par défaut pour les fonctions API Windows et COM. Il permet à l'appelé (la fonction appelée) de nettoyer la pile après l'exécution, la rendant plus compacte dans les environnements aux ressources limitées. Cependant, cet avantage s'accompagne d'un risque de déséquilibre de la pile si le nombre d'arguments attendus par l'appelant et l'appelé ne correspond pas.
__cdecl
: Nettoyage de l'appelant des fonctions variadiques
__cdecl
est la convention d'appel standard en C pour les fonctions avec un nombre variable d'arguments, telles que printf()
et scanf()
. Cette convention confie la responsabilité du nettoyage de la pile à l'appelant, puisque celui-ci connaît le nombre d'arguments passés. Oublier de spécifier [DllImport]
dans une déclaration CallingConvention.Cdecl
en C# est un piège courant.
__thiscall
: Masqué ce pointeur de la méthode C
__thiscall
fait spécifiquement référence à C et est utilisé pour gérer le passage de pointeurs this
cachés dans les méthodes d'instance d'une classe. Il est similaire à __cdecl
, mais le marshaleur .NET P/Invoke ne le prend pas en charge, il ne convient donc pas à une utilisation avec le code C pinvoke.
Résumé
La coexistence des appels en C# et des signatures cdecl
en C est le résultat de ces conventions d'appel historiques et des exigences spécifiques de chaque langage. Une bonne compréhension de ces conventions, ainsi que des attributs __stdcall
et [DllImport]
de EntryPoint
, est essentielle pour garantir une fonctionnalité P/Invoke correcte et éviter des problèmes potentiels tels que le déséquilibre de la pile. ExactSpelling
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!