You'll have to do this manually, since there's no way to tell the P/Invoke layer how much data to marshal from your C++ return value.
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 = (IntPtr)((int)ptr + structSize);
}
Note that if you want to free the memory for innerStructs
from your C# code, you have to use the standard allocator CoTaskMemAlloc
in your C++ code--then you can call Marshal.CoTaskMemFree
to free innerStructs
.