Maison  >  Article  >  développement back-end  >  Pourquoi est-ce que j'obtiens des erreurs « PinvokeStackImbalance » dans Visual Studio 2010 lors de l'appel d'une DLL C à partir de C# ?

Pourquoi est-ce que j'obtiens des erreurs « PinvokeStackImbalance » dans Visual Studio 2010 lors de l'appel d'une DLL C à partir de C# ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-02 21:42:30583parcourir

Why Do I Get

Erreur PinvokeStackImbalance dans Visual Studio 2010

Question :

Lors de la mise à niveau vers Visual Studio 2010 , les utilisateurs rencontrent une exception persistante « pinvokestackimbalance » lors de l’appel d’une DLL C à partir d’une application C#. Cette exception n'était pas présente dans Visual Studio 2008.

Réponse :

Cette exception est due à une modification du comportement par défaut de l'assistant de débogage géré (MDA) dans Visual Studio 2010. Pour résoudre ce problème, envisagez les étapes suivantes :

  1. Corrigez la convention d'appel :

    La cause principale de l'exception est un paramètre de convention d'appel incorrect. Dans Visual Studio 2010, la convention d'appel par défaut pour DllImport est CallingConvention.WinApi, qui équivaut à CallingConvention.StdCall pour les applications de bureau x86. Cependant, dans ce cas, la DLL C attend la convention d'appel Cdecl.

    Pour corriger cela, modifiez l'attribut [DllImport] dans le code C# pour spécifier explicitement CallingConvention.Cdecl.

    <code class="cs">[DllImport("ImageOperations.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern void FasterFunction(
        [MarshalAs(UnmanagedType.LPArray)]ushort[] inImage,
        [MarshalAs(UnmanagedType.LPArray)]byte[] outImage,
        int inTotalSize, int inWindow, int inLevel);</code>
  2. Désactivez le MDA PinvokeStackImbalance :

    Le MDA PinvokeStackImbalance peut être désactivé dans les paramètres de débogage de Visual Studio pour l'empêcher d'interférer avec d'autres tâches de débogage.

    • Ouvrez les outils de Visual Studio > Menu Options.
    • Accédez à Débogage > Général.
    • Décochez l'option « Activer les assistants de débogage gérés ».

Considérations supplémentaires :

  • Le MDA PinvokeStackImbalance n'est pas activé par défaut en mode Release, donc le problème ne se produira pas lors de la construction pour la version.
  • Pour plus d'informations, reportez-vous à la documentation MSDN sur l'énumération CallingConvention (https://docs.microsoft .com/en-us/dotnet/framework/unmanaged-api/calling-conventions-for-platform-invoke#the-callingconvention-enumeration).

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!

Déclaration:
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