gpt4 book ai didi

c# - 使用 PInvoke 返回包含 char[] 结构的结构数组

转载 作者:行者123 更新时间:2023-11-30 15:05:42 25 4
gpt4 key购买 nike

我有一个从 PInvoke 返回的结构数组,如果该结构只包含 int 或 float,它会返回数组,但是当我尝试返回一个 char 数组时,它开始变得困惑,我尝试返回一个IntPtr,但这还没有成功。我有什么想法可以使它正常工作吗?

C代码

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;
}

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)
}

最佳答案

对于非托管代码而言,字符数组只是一个字符串,因此您在这里有两个选择。使用哪一个取决于当字符数据返回 C# 时您实际需要如何使用它:

  1. 将其编码为数组。参见 this article关于如何编码嵌入到结构中的数组(编辑:这需要是 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;
    };
  2. 将其编码为字符串。参见 this article了解如何编码结构中包含的字符串。

    [StructLayout(LayoutKind.Sequential)]
    public struct return_part {
    public int partid;
    public int numcomp;
    public int parttype;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=100)]
    public string partname;
    };

关于c# - 使用 PInvoke 返回包含 char[] 结构的结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8759233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com