Maison > développement back-end > C++ > Pourquoi les conventions d'appel Cdecl et Stdcall ne correspondent-elles pas dans C# P/Invoke, et comment cela peut-il être corrigé ?

Pourquoi les conventions d'appel Cdecl et Stdcall ne correspondent-elles pas dans C# P/Invoke, et comment cela peut-il être corrigé ?

Linda Hamilton
Libérer: 2025-01-25 23:36:13
original
190 Les gens l'ont consulté

Why Do Cdecl and Stdcall Calling Conventions Mismatch in C# P/Invoke, and How Can This Be Fixed?

Comprendre C # P / Invoquer les conflits de convention d'appel: CDECL vs stdcall

plate-forme Invoke (p / invoke) ponts gérés (C #) et non gérés (par exemple, c). Cependant, les écarts dans les conventions d'appels peuvent provoquer des problèmes d'interopérabilité.

La source du problème

Le conflit provient de la gestion des congrès différentes de la convention entre C et les paramètres P / Invoke par défaut en C #.

  • C: C Les fonctions utilisent souvent la convention __stdcall. La fonction appelée (callee) est responsable du nettoyage de la pile.
  • c # p / invoquer par défaut: c # 'S P / invoke défaut de CallingConvention.Winapi, qui, sur Windows, équivaut à __stdcall.

Clé des appels de congrès de clé Différences:

Les différences de base résident:

  • Mot-clé de la convention: __stdcall en C versus CallingConvention.Winapi (ou CallingConvention.Stdcall) en C #.
  • Gestion de la pile: __cdecl (souvent utilisée en c) nécessite la fonction d'appel (caller) pour nettoyer la pile; __stdcall attribue cela au callee.
  • Ordre de l'argument: Bien que moins courant en tant que source d'erreur dans ce contexte spécifique, l'ordre d'argument peut varier entre les conventions.

Exemple de déclaration p / invoque incorrect:

Une déclaration C # incorrecte peut utiliser CallingConvention.Cdecl lorsque la fonction C utilise __stdcall. Cela conduit à empiler les erreurs de corruption et d'exécution.

La bonne déclaration C #:

Pour assurer la compatibilité, l'attribut C # DllImport doit correspondre à la convention de la fonction C:

<code class="language-csharp">[DllImport("CPlusPlus.dll", ExactSpelling = true, SetLastError = true, CallingConvention = CallingConvention.Winapi)]
private static extern int InvokedFunction(IntPtr intArg);</code>
Copier après la connexion

Empêcher les décalages des congrès:

Confirmez toujours la convention d'appel de la fonction non gérée et le reflète précisément dans votre déclaration C # DllImport. Consultez la documentation de Microsoft pour des informations détaillées sur les conventions d'appels prises en charge.

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