如何在C#中编组结构体数组?

11

我在 C# 中有以下结构:

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct RECORD
{
    public uint m1;
    public uint m2;
    public uint m3;
}

我需要传递一个数组(固定长度)的这些结构体到本地代码,以便对这些结构体写入数据。该数组在C#中分配并传递到C dll。我将导入的函数声明为:

[DllImport("marshall.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void doIt(RECORD[] dataRecord);

但我没有收到任何数据。我已经尝试过PInvoke Interop助手了。我应该在这里使用IntPtr吗?有什么想法吗?

编辑:

这是调用本地函数的C#代码:

RECORD[] rec = new RECORD[256];
doIt(rec);
// values of rec are all zero here

以下是C语言函数:

int doIt(RECORD* rec)
{
    // deref pointer and write some data
}
1个回答

14

我离P/Invoke专家还很远,但我想知道将其设置为输入/输出参数是否有帮助:

DllImport("marshall.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void doIt([In, Out] RECORD[] dataRecord);

我并不希望那是必需的,因为使用 LayoutKind.Sequential,我希望你的结构体已经是可调用类型,而且数组也是可调用的。


做到了,谢谢。这些关键字还有其他用法吗?我以前没见过它们。 - SDD
1
从MSDN: [涉及到可平坦化类型的数组] 然而,这些类型实际上被编组为输入参数,并且如果您想将参数编组为输入/输出参数,则必须应用InAttribute和OutAttribute属性。 - SDD
谢谢,这对我很有帮助——结束了两个小时的挣扎。 - Menno Deij - van Rijswijk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接