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结构中有嵌套的结构.我无法控制外部方法的设计方式.调用此函数并接收结构数组的正确方法是什么?
你应该这样声明:
[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)
不需要不安全或固定.删除所有这些.