将 C++ DLL 导入 C#

Import a C++ DLL into C#

我尝试在我的 C# 项目中实现 C++ DLL。我给出了以下头文件:

#ifdef EBEXPORT
const long EBDECL
#else
const long EBDECL __declspec(dllimport)
#endif

const long EBCALL __stdcall


#if defined (__cplusplus)
extern "C" 
{
#endif

EBDECL long EBCALL EbInitTcp(long nUnit, const char* pIP, long nIPSize);

#if defined (__cplusplus)
}
#endif

这是我用来在 C# 中实现 DLL 的代码:

using System.Runtime.InteropServices;

namespace NoName
{
    class DLLImport
    {
        [DllImport("C:/lib/host.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern long EbInitTcp(long nUnit, string pIP, long nIPSize);

        public void Init()
        {
            string ip = "192.168.0.1";
            EbInitTcp(1, ip, ip.Length));
        }

    }
}

如果我执行代码,我会收到 PInvokeStackImbalance 异常。 你能帮帮我吗?

验证您的调用约定;请注意 extern "C" 默认为 CallingConvention.Cdecl。这个错误一般是调用约定错误导致的。

另请注意,C# 的 long 和 C++ 的 long 可能不同。

您似乎在尝试指定 __stdcall,但这是一个语法错误。无论如何请确保您的调用约定是同步的。

不平衡可能是由不匹配的调用约定(cdeclstdcall)或不匹配的函数参数引起的,无论是大小还是类型。

C++ 调用约定定义有点不寻常,通常用 #define.

定义
#ifdef EBEXPORT
  #define EBDECL __declspec(dllexport)
#else
  #define EBDECL __declspec(dllimport)
#endif

#define EBCALL __stdcall

#if defined (__cplusplus)
extern "C" 
{
#endif

EBDECL const long EBCALL EbInitTcp(long nUnit, const char* pIP, long nIPSize);

#if defined (__cplusplus)
}
#endif

在 C# 端;

using System.Runtime.InteropServices;

namespace NoName
{
    class DLLImport
    {
        [DllImport("C:/lib/host.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern long EbInitTcp(int nUnit, string pIP, int nIPSize);

        public void Init()
        {
            string ip = "192.168.0.1";
            EbInitTcp(1, ip, ip.Length));
        }

    }
}