在C#中将结构数组编组到指针

Jon*_*ury 2 c# pinvoke interop

我试图调用一个看起来像这样的非托管函数(DATA是我的C#结构):

[DllImport("data.dll")]
internal static unsafe extern int MyExternalFunction(DATA* pData, uint numElements);
Run Code Online (Sandbox Code Playgroud)

这就是我从C#调用函数的方式:

DATA[] data = new DATA[64];
fixed (DATA* pData = data )
{
    MyExternalFunction(pData, 64);
}

[StructLayout(LayoutKind.Sequential)]
internal struct DATA
{
    internal uint a;
    internal uint b;
    internal uint c;
    internal POINT pos;
}

[StructLayout(LayoutKind.Sequential)]
internal struct POINT 
{
    internal int x;
    internal int y;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是我收到了这个错误:"无法编组'参数#1':指针不能引用封送结构."

如果它有任何区别,我的DATA结构中有嵌套的结构.我无法控制外部方法的设计方式.调用此函数并接收结构数组的正确方法是什么?

Dav*_*nan 5

你应该这样声明:

[DllImport("data.dll")]
public static extern int MyExternalFunction(
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]
    DATA[] Data, 
    uint numElements
);
Run Code Online (Sandbox Code Playgroud)

并称之为:

MyExternalFunction(myArray, myArray.Length);
Run Code Online (Sandbox Code Playgroud)

不需要不安全或固定.删除所有这些.