这个简单的C ++ DLL在C#中不起作用

时间:2012-05-22 19:29:10

标签: c# c++ dll pinvoke

我一直在努力研究c ++中需要运行的c ++代码。我浏览了这个DLL tutorial并且在我的c#app中使用它时遇到了麻烦。我将在下面发布所有代码。

我收到此 PInvokeStackImbalance 错误:'调用PInvoke函数'frmVideo :: Add'使堆栈失衡。这很可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。'

一如既往地谢谢 凯文

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;
   }
}

使用DLL的C#代码:

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 个答案:

答案 0 :(得分:5)

您的C ++代码使用cdecl调用约定,C#代码默认使用stdcall。这种不匹配解释了您所看到的信息。

使界面的两边匹配:

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

或者,您可以使用stdcall进行C ++导出:

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

取决于您选择这两个选项中的哪一个,但请确保您只更改界面的一侧而不是两者,原因显而易见!