在我们讨论代表之前,我怀疑您对结构的打包是错误的。这样做是很不寻常的。仅当您找到该包时才执行此操作#pragma
在C代码中。
The e_cc
字段不是函数指针。它只是一个空指针。在 C# 中就是IntPtr
.
The pl
member 是一个由 4 个指针组成的数组。我不太确定它们包含什么,但可以肯定你可以像这样整理它:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public IntPtr[] pl;
这样您就可以手动干预来填充数组或读取其内容。这有可能由编组器完成,但在不知道互操作的语义的情况下,我无法说出如何做到这一点。
As for done
,您应该在结构之外声明委托。像这样:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void doneDelegate(IntPtr thisobj);
这里我假设调用约定是cdecl
因为 C 代码中没有什么可说的。
把它们放在一起你有:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void doneFunc(IntPtr thisobj);
[StructLayout(LayoutKind.Sequential)]
public struct f_tt
{
public uint w;
public uint h;
public uint f_cc;
public uint st;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public IntPtr[] pl;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public int[] strd;
public doneDelegate done;
public IntPtr e_cc;
public uint rsrvd2;
public uint rsrvd3;
}