我有一个第三方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已被编组,而numpoints
,highdim
和startrow
已由我已导入的importheader
方法返回。< / p>
答案 0 :(得分:2)
您是否尝试过使用IntPtr而不是数组并手动解析?