将 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
,但这是一个语法错误。无论如何请确保您的调用约定是同步的。
不平衡可能是由不匹配的调用约定(cdecl
与 stdcall
)或不匹配的函数参数引起的,无论是大小还是类型。
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));
}
}
}
我尝试在我的 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
,但这是一个语法错误。无论如何请确保您的调用约定是同步的。
不平衡可能是由不匹配的调用约定(cdecl
与 stdcall
)或不匹配的函数参数引起的,无论是大小还是类型。
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));
}
}
}