C# 如何调用C++;dll从c导出函数# 这是我第一次尝试把C语言与非托管C++混合,所以这可能是个很简单的问题,但我不明白。 我需要调用一些函数从C++ DLL到C代码。以下是dll项目的代码:

C# 如何调用C++;dll从c导出函数# 这是我第一次尝试把C语言与非托管C++混合,所以这可能是个很简单的问题,但我不明白。 我需要调用一些函数从C++ DLL到C代码。以下是dll项目的代码:,c#,.net,c++,windows,pinvoke,C#,.net,C++,Windows,Pinvoke,.h文件: #pragma once #include <iostream> #if defined FIRSTDLL_EXPORTS #define DECLDIR __declspec(dllexport) #else #define DECLDIR __declspec(dllimport) #endif extern "C" { DECLDIR int Add( int a, int b ); DECLDIR void Fu

.h文件:

#pragma once 
#include <iostream>
#if defined FIRSTDLL_EXPORTS
    #define DECLDIR __declspec(dllexport)
#else
    #define DECLDIR __declspec(dllimport)
#endif

extern "C"
    {
      DECLDIR int Add( int a, int b );
      DECLDIR void Function( void );
    }
当我试着运行这个时,我得到了

托管调试助手“PinvokeStackDistribution”在“C:\Program Files\Microsoft Office\Office14\WINWORD.EXE”中检测到问题。 其他信息:对PInvoke函数“MyAddin!MyAddin.ThisAddIn::Add”的调用使堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。请检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。” 但正如我看到的,签名是一样的。我错过了什么


谢谢 解决方法是使您的通话约定匹配

例如,您可以这样更改p/Invoke:

[DllImport("firstDLL.Dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int Add(int a, int b);
另一个选项是更改您的C++:

#if defined FIRSTDLL_EXPORTS(returntype)
    #define DECLDIR __declspec(dllexport) returntype __stdcall
#else
    #define DECLDIR __declspec(dllimport) returntype __stdcall
#endif
显然,你应该只做其中一个。如果你同时改变C和C++,你会遇到同样的问题。p>
<如果我是你,我会把C++代码作为CDDEL,并将C++修改成匹配。

你可以尝试将“Y-STDCPLAN调用约定”添加到C++函数声明中。或者,使用C#中的callingconvention属性编辑您的问题并发布准确的错误。
[DllImport("firstDLL.Dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int Add(int a, int b);
#if defined FIRSTDLL_EXPORTS(returntype)
    #define DECLDIR __declspec(dllexport) returntype __stdcall
#else
    #define DECLDIR __declspec(dllimport) returntype __stdcall
#endif