Esta simple DLL de C++ no funciona en C#

Me he pasado el día trabajando en el código C++ que necesito ejecutar en C#. pasé por esto Tutorial de DLL y he tenido problemas para usarlo en mi aplicación c#. Publicaré todo el código a continuación.

Estoy obteniendo esto PInvokeStackDesequilibrio error: 'Una llamada a la función PInvoke 'frmVideo::Add' ha desequilibrado la pila. Es probable que esto se deba a que la firma de PInvoke administrada no coincide con la firma de destino no administrada. Verifique que la convención de llamadas y los parámetros de la firma PInvoke coincidan con la firma no administrada de destino.'

Gracias como siempre Kevin

DLLTutorial.h

#ifndef _DLL_TUTORIAL_H_
#define _DLL_TUTORIAL_H_
#include <iostream>

#if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif

extern "C"
{
   DECLDIR int Add( int a, int b );
   DECLDIR void Function( void );
}

#endif

DLLTutorial.cpp

#include <iostream>

#define DLL_EXPORT

#include "DLLTutorial.h"


extern "C"
{
   DECLDIR int Add( int a, int b )
   {
      return( a + b );
   }

   DECLDIR void Function( void )
   {
      std::cout << "DLL Called!" << std::endl;
   }
}

Código C# para usar la DLL:

using System.Runtime.InteropServices;
[DllImport(@"C:\Users\kpenner\Desktop\DllTutorialProj.dll"]
public static extern int Add(int x, int y);
int x = 5;
int y = 10;
int z = Add(x, y);

preguntado el 22 de mayo de 12 a las 20:05

1 Respuestas

Su código C++ usa el cdecl convención de llamada y el código C# por defecto es stdcall. Esta discrepancia explica el mensaje que ve.

Haz que los dos lados de la interfaz coincidan:

[DllImport(@"...", CallingConvention=CallingConvention.Cdecl]
public static extern int Add(int x, int y);

Alternativamente, podrías usar stdcall para sus exportaciones de C++:

DECLDIR __stdcall int Add( int a, int b );

Depende de usted cuál de estas dos opciones elige, pero asegúrese de cambiar solo un lado de la interfaz y no ambos, ¡por razones obvias!

contestado el 22 de mayo de 12 a las 20:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.