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