How to marshal a variable sized array of structs? C# and C++ interop help

后端 未结 1 788
一个人的身影
一个人的身影 2020-12-30 05:05

I have the following C++ structs

struct InnerStruct
{
   int A;
   int B;
};

struct OuterStruct
{
   int numberStructs;
   InnerStruct* innerStructs;
};


        
相关标签:
1条回答
  • 2020-12-30 05:38

    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 = 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.

    0 讨论(0)
提交回复
热议问题