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 #.
__stdcall
. La fonction appelée (callee
) est responsable du nettoyage de la pile. CallingConvention.Winapi
, qui, sur Windows, équivaut à __stdcall
. Clé des appels de congrès de clé Différences:
Les différences de base résident:
__stdcall
en C versus CallingConvention.Winapi
(ou CallingConvention.Stdcall
) en C #. __cdecl
(souvent utilisée en c) nécessite la fonction d'appel (caller
) pour nettoyer la pile; __stdcall
attribue cela au callee
. 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>
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!