您必须手动执行此操作,因为无法告诉 P/Invoke 层从您的 C++ 返回值中编组多少数据。
struct OuterStruct {
int numberStructs;
IntPtr innerStructs;
};
OuterStruct s = getStructs(); // using DllImport
var structSize = Marshal.SizeOf(typeof(InnerStruct));
var innerStructs = new List<InnerStruct>();
var ptr = s.innerStructs;
for (int i = 0; i < s.numberStructs; i++)
{
innerStructs.Add((InnerStruct)Marshal.PtrToStructure(ptr,
typeof(InnerStruct));
ptr = ptr + structSize;
}
请注意,如果您想innerStructs
从 C# 代码中释放内存,则必须在 C++ 代码中使用标准分配器CoTaskMemAlloc
——然后您可以调用Marshal.CoTaskMemFree
free innerStructs
。