Wrapper C # de c ++ dll; «Échec de la vérification au moment de l’exécution n ° 0 – La valeur de ESP n’a pas été correctement enregistrée dans un appel de fonction.

Voici le code en dll c ++:

extern "C" _declspec(dllexport) int testDelegate(int (*addFunction)(int, int), int a, int b) { int res = addFunction(a, b); return res; } 

et voici le code en C #:

 public delegate int AddIntegersDelegate(int number1, int number2); public static int AddIntegers(int a, int b) { return a + b; } [DllImport("tester.dll", SetLastError = true)] public static extern int testDelegate(AddIntegersDelegate callBackProc, int a, int b); public static void Main(ssortingng[] args) { int result = testDelegate(AddIntegers, 4, 5); Console.WriteLine("Code returned:" + result.ToSsortingng()); } 

Lorsque je lance cette petite application, je reçois le message à partir de l’en-tête de ce message. Quelqu’un peut aider, s’il vous plaît?

Merci d’avance,

Adam a raison, vous avez un décalage dans la convention d’appel d’une version 32 bits de Windows. La valeur par défaut du pointeur de la fonction est __cdecl, celle de la déclaration du délégué est CallingConvention.StdCall. En raison de cette incompatibilité, le pointeur de stack ne peut pas être correctement restauré au retour de l’appel délégué, ce qui déclenche le diagnostic dans la version de débogage de votre code C / C ++.

Pour résoudre le problème du côté C / C ++:

 typedef int (__stdcall * Callback)(int, int); extern "C" _declspec(dllexport) int testDelegate(Callback addFunction, int a, int b) { int res = addFunction(a, b); return res; } 

Pour résoudre le problème du côté C #:

  [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate int AddIntegersDelegate(int number1, int number2); 

L’argument du pointeur de la fonction testDelegate doit être marqué avec __stdcall , sinon son appel endommagera la stack (car il utilise des conventions d’appel différentes.)

Cela signifie généralement une “incompatibilité d’interface”: la déclaration utilisée pour comstackr le client est différente de la version actuelle de dll.