如何导入返回此结构的DLL函数?

时间:2011-06-09 15:17:26

标签: c# visual-c++ dllimport

我有一个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 ++时代开始已经有一段时间了。

1 个答案:

答案 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,这是默认设置。