У меня есть сторонний 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
, который я уже импортировал.