Как я могу импортировать функцию DLL, которая возвращает эту структуру? - PullRequest
3 голосов
/ 09 июня 2011

У меня есть 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 Ответ

2 голосов
/ 09 июня 2011

Это должно сделать работу за вас:

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;
}

Убедитесь, что вы используете Charset.ASCII в DLLImport, который используется по умолчанию.

...