包含字符串数组的结构的C#dllimport

时间:2012-02-21 13:14:36

标签: c# c struct pinvoke decimal

我有一个第三方c dll,我想在我的c#项目中使用它。我设法导入一个读取文件头的方法。现在我想访问读取数据的方法。我认为问题是包含字符串数组的结构,所以我尝试了各种各样的东西,比如StringBuilder列表,创建字符串列表并将其作为数组传递,直接创建字符串数组(如下所示)。在这已经花了一整天之后,我不再知道该怎么做了。我也不确定我是否可以按照现在的方式传递十进制数组(因为它没有列在http://msdn.microsoft.com/en-us/library/ac7ay120(v=vs.100).aspx)。

dll的C标题:

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已被编组,而numpointshighdimstartrow已由我已导入的importheader方法返回。< / p>

1 个答案:

答案 0 :(得分:2)

您是否尝试过使用IntPtr而不是数组并手动解析?