C # dllimport структуры, содержащей массив строк - PullRequest
1 голос
/ 21 февраля 2012

У меня есть сторонний cll, который я хочу использовать в моем проекте на c #.Мне удалось импортировать один метод, который читает заголовок файла.Теперь я хочу получить доступ к методу, который читает данные.Я думаю, что проблема заключается в структуре, содержащей массив строк, поэтому я пробовал разные вещи, такие как список StringBuilder, создание списка строк и передачу его в виде массива, чтобы просто создать массив строк напрямую (как показано ниже).Потратив на это целый день, я больше не знаю, что делать дальше.Я также не уверен, могу ли я просто передать десятичный массив так, как я это делаю сейчас (поскольку он не указан в заголовке http://msdn.microsoft.com/en-us/library/ac7ay120(v=vs.100).aspx).

C dll:

enum id_retrieve_enum {
  GET_ID = 1,
  DO_NOT_GET_ID,  // id is in file
  NO_ID_IN_FILE,
  CREATE_ID       // id is not in file
};

struct id_struct {
  char **values;                     // allocated
  int size;                          // optional: DEFAULT_VALUE = NULL_INT
  enum id_retrieve_enum retrieve;    // optional
};

int importdata(char *fullfilename, int numrows, int numcols, int startrow, 
               decimal *dataset, struct id_struct *ids);

C #код перечисления и структуры:

public enum id_retrieve_enum
{
  GET_ID = 1,
  DO_NOT_GET_ID,  // id is in file    
  NO_ID_IN_FILE,
  CREATE_ID       // id is not in file
};

[StructLayout(LayoutKind.Sequential)]
public struct id_struct
{
  [MarshalAs(UnmanagedType.SafeArray)]
  public String[] values;
  public int size;
  public id_retrieve_enum retrieve;
};

dllimport:

[DllImport("libpandconv.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int importdata(
  String fullfilename, 
  int numrows, 
  int numcols, 
  int startrow, 
  Decimal[] dataset,
  [In, Out, MarshalAs(UnmanagedType.Struct)] ref id_struct ids);

Данные инициализации и метод вызова:

Decimal[] data = new Decimal[numpoints * highdim];

id_struct ids = new id_struct();
  ids.retrieve = (hasid.Equals(1)) ? id_retrieve_enum.GET_ID : id_retrieve_enum.CREATE_ID;
  ids.values = new String[numpoints];

importdata(inputfilename, numpoints, highdim, startrow, data, ref ids);

, где inputfilenam e уже было назначеноnumpoints, highdim и startrow уже возвращены методом importheader, который я уже импортировал.

1 Ответ

2 голосов
/ 21 февраля 2012

Вы пытались использовать IntPtr вместо массива и разрешать его вручную?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...