Esta simple DLL de C++ no funciona en C#
Frecuentes
Visto 843 veces
0
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);
1 Respuestas
5
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 c# c++ dll pinvoke or haz tu propia pregunta.