Maison > développement back-end > C++ > Pourquoi les appels C # `CDECL` et les signatures C` __STDCALL` coexistent-ils en P / Invoke?

Pourquoi les appels C # `CDECL` et les signatures C` __STDCALL` coexistent-ils en P / Invoke?

Mary-Kate Olsen
Libérer: 2025-01-25 23:41:10
original
348 Les gens l'ont consulté

Why Do C# `Cdecl` Calls and C   `__stdcall` Signatures Coexist in P/Invoke?

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal