我有一个DLL及其头文件,它是用Visual C ++编写的。我需要在C#项目中使用以下函数:
LIBSPEC int
CprFindDevices(
PCprDeviceInfo *ppDevInfo,
int *pNumDevices,
DWORD timeout
);
我可以使用DllImport
导入它,但我无法弄清楚如何在C#中实现以下结构:
typedef struct _CprDeviceInfo
{
unsigned char id[ID_LEN];
unsigned char macAddr[MAC_LEN];
in_addr inAddr;
char ipAddr[IP_LEN];
char devName[INFO_NAME_LEN];
char port1Name[INFO_NAME_LEN];
char port2Name[INFO_NAME_LEN];
int tcpPort1;
int tcpPort2;
char interfaceIpAddr[IP_LEN];
} CprDeviceInfo, *PCprDeviceInfo;
全大写变量都是我可以在C#项目中使用的已知常量。
我知道我必须使用[StructLayout(LayoutKind.Sequential)]
,但我不确定每个结构成员的等效类型是什么,以及导入它时函数签名是什么。从我的C ++时代开始已经有一段时间了。
答案 0 :(得分:2)
这应该适合你:
struct CprDeviceInfo
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = ID_LEN)]
string id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAC_LEN)]
string macAddr;
uint inAddr;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = IP_LEN)]
string ipAddr;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = INFO_NAME_LEN)]
string devName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = INFO_NAME_LEN)]
string port1Name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = INFO_NAME_LEN)]
string port2Name;
int tcpPort1;
int tcpPort2;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = IP_LEN)]
string interfaceIpAddr;
}
确保在DLLImport中使用Charset.ASCII
,这是默认设置。