我有一个从 PInvoke 返回的结构数组,如果结构只包含 int 或 float,它返回数组很好,但是当我尝试返回一个 char 数组时,它开始变得混乱,我尝试返回一个 IntPtr,但是那没有成功。我有什么想法可以让这个工作吗?
代码
struct return_part {
int partid;
int numcomp;
int parttype;
char partname[100];
};
extern int return_parts(return_part ** array, int * arraySizeInElements) {
int partcount = 0;
struct list_part *currentnode;
currentnode = head;
struct section_list *section;
struct return_part *temppart;
while (currentnode != NULL) {
partcount++;
currentnode = currentnode->next;
}
currentnode = head;
*arraySizeInElements = partcount;
int bytesToAlloc = sizeof(return_part) * (*arraySizeInElements);
return_part * a = static_cast<return_part *>(CoTaskMemAlloc(bytesToAlloc));
*array = a;
int q = 0;
while (currentnode != NULL) {
struct return_part tmp;
tmp.partid = currentnode->partid;
tmp.numcomp = currentnode->numcomp;
strcpy(tmp.partname, currentnode->partname);
tmp.parttype = currentnode->parttype;
a[q] = tmp;
q++;
currentnode = currentnode->next;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C# 代码
[StructLayout(LayoutKind.Sequential)]
public struct return_part {
public int partid;
public int numcomp;
public int parttype;
public char partname;
};
internal static class UnsafeNativeMethods
{
[DllImport(_dllLocation, CallingConvention = CallingConvention.Cdecl)]
public static extern int return_parts([MarshalAs(UnmanagedType.LPArray,
SizeParamIndex = 1)] out return_part[] array, out int arraySizeInElements);
}
public static ReturnPoint[] getpoints(int partid) {
return_parts[] parts;
int size;
int result = UnsafeNativeMethods.return_parts(out parts, out size)
}
Run Code Online (Sandbox Code Playgroud)
对于非托管代码,字符数组只是一个字符串,因此这里有两个选项。您使用哪一个取决于当字符数据返回到 C#-land 时您实际需要如何使用它:
将其编组为数组。请参阅这篇文章,了解如何对嵌入到结构中的数组进行编组(编辑:这需要是 ByValArray,而不是我最初指出的 LPArray;谢谢@Hans):
[StructLayout(LayoutKind.Sequential)]
public struct return_part {
public int partid;
public int numcomp;
public int parttype;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=100)]
public char[] partname;
};
Run Code Online (Sandbox Code Playgroud)将其编组为字符串。有关如何编组包含在结构中的字符串,请参阅本文。
[StructLayout(LayoutKind.Sequential)]
public struct return_part {
public int partid;
public int numcomp;
public int parttype;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=100)]
public string partname;
};
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
3049 次 |
| 最近记录: |